PDA

View Full Version : سوال: مشکل فراخوانی متد در فرم دیگر



daniyaltjm
جمعه 05 شهریور 1395, 20:45 عصر
سلام، من یک متد در یک فرم دارم حالا که میخوام از اون توی فرم دیگه استفاده کنم کار نمیکنه!! به این صورت عمل میکنم : توی فرم دومم یک شی از فرم اول میسازم و بعد اون تابع رو صدا میزنم و بهش پارامتر میدم ولی نمی دونم چرا کار نمیکنه!!!

این متد در فرم اول:

public void Upd(string strcommand)
{
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=TelAddress;Integrated Security=True");
SqlCommand cm = new SqlCommand();
cm.Connection = con;
cm.CommandText = strcommand;
cm.Connection.Open();
cm.ExecuteNonQuery();
SqlDataAdapter da = new SqlDataAdapter(cm);
DataTable dt = new DataTable();
da.Fill(dt);
radGridView1.DataSource = dt;
radGridView1.Columns[0].HeaderText = "کد";
radGridView1.Columns[1].HeaderText = "نام";
radGridView1.Columns[2].HeaderText = "نام خانوادگی";
radGridView1.Columns[3].HeaderText = "تلفن";
radGridView1.Columns[4].HeaderText = "آدرس";
radGridView1.Columns[0].Width = 50;
radGridView1.Columns[1].Width = 100;
radGridView1.Columns[2].Width = 100;
radGridView1.Columns[3].Width = 120;
radGridView1.Columns[4].Width = 400;
cm.Connection.Close();
}

اینم فراخوانی متد در فرم دوم:

Main m1 = new Main();
m1.Upd("select ID_Name,Name,Family,Tel,Address from Tbl_Name,Tbl_Address where ID_Name=Prs_ID");

omid nasri
جمعه 05 شهریور 1395, 21:03 عصر
در حالت دیباگ کد radGridView1 رو تست کنید که به نظر بنده باید null باشه چرا که شما از کلاس نمونه ایجاد کردید اما radGridView1 که ایجاد نشده.

daniyaltjm
جمعه 05 شهریور 1395, 21:11 عصر
در حالت دیباگ کد radGridView1 رو تست کنید که به نظر بنده باید null باشه چرا که شما از کلاس نمونه ایجاد کردید اما radGridView1 که ایجاد نشده.

همیشه در مد دیباگ اجرا میکنم ولی این Null که گفتید توی کدوم پنجره باید ببینم؟ در کل روش درست چیه؟

abdullah20
جمعه 05 شهریور 1395, 21:38 عصر
دوست عزیز این متد و کوئری که دارید در همون فرم اول به نظرتون جواب میده؟

abdullah20
جمعه 05 شهریور 1395, 21:47 عصر
مشکل از استفاده متد در فرم دیگر و دیتاگرید نیست
مشکل کوئری شماست

daniyaltjm
جمعه 05 شهریور 1395, 22:43 عصر
دوست عزیز این متد و کوئری که دارید در همون فرم اول به نظرتون جواب میده؟

آره، جواب داده ولی توی فرم دوم نه.

mr.sirwan
جمعه 05 شهریور 1395, 22:46 عصر
daniyaltjm (http://barnamenevis.org/member.php?226272-daniyaltjm) عزیز، کاری که شما داری میکنی (فراخوانی یک متد ساده با استفاده از ابجکت ساختن از یک فرم) فوق العاده ناکارامد و از لحاظ شئ گرایی کاملا رد میشه، دوست عزیز اصولیترش اینه که شما بیاین و یک کلاس ایجاد کنین و تمام متد هایی که با دیتابیس در ارتباط هستن رو به صورت Static در اونجا بنویسی و هرجا که لازم داشتی از طریق کلاس مذکور و عملگر . (نقطه) و نه از طریق نمونه سازی از کلاس، فراخوانیشون کنی

مورد بعدی اینکه همیشه سعی کنین واکشی اطلاعات و مقداردهی اطلاعات به کنترل ها رو از هم تفکیک کنین و توسط متدهای جداگانه اینکارو انجام بدین، برای مثال یک متد با مقدار بازگشتی Datatable تعریف کنین و داخل متد اطلاعات مورد نظرتون رو واکشی و return کنین و در متد بعدی بیاین یک ابجکت از Datatable ایجاد و مقدارش رو برابر با ابجکت return شده از متد مذکور قرار بدین و درنهایت دیتاگرید رو با این ابجکت مقدار دهی کنین

daniyaltjm
جمعه 05 شهریور 1395, 22:57 عصر
daniyaltjm (http://barnamenevis.org/member.php?226272-daniyaltjm) عزیز، کاری که شما داری میکنی (فراخوانی یک متد ساده با استفاده از ابجکت ساختن از یک فرم) فوق العاده ناکارامد و از لحاظ شئ گرایی کاملا رد میشه، دوست عزیز اصولیترش اینه که شما بیاین و یک کلاس ایجاد کنین و تمام متد هایی که با دیتابیس در ارتباط هستن رو به صورت Static در اونجا بنویسی و هرجا که لازم داشتی از طریق کلاس مذکور و عملگر . (نقطه) و نه از طریق نمونه سازی از کلاس، فراخوانیشون کنی

مورد بعدی اینکه همیشه سعی کنین واکشی اطلاعات و مقداردهی اطلاعات به کنترل ها رو از هم تفکیک کنین و توسط متدهای جداگانه اینکارو انجام بدین، برای مثال یک متد با مقدار بازگشتی Datatable تعریف کنین و داخل متد اطلاعات مورد نظرتون رو واکشی و return کنین و در متد بعدی بیاین یک ابجکت از Datatable ایجاد و مقدارش رو برابر با ابجکت return شده از متد مذکور قرار بدین و درنهایت دیتاگرید رو با این ابجکت مقدار دهی کنین

خوب چرا من با وجود ایجاد یک نمونه از فرم Main و فراخوانی متد ()upd هیچ خطایی نمیده و هیچ کاری هم نمیکنه؟ در کل اگه نخوام کلاس بسازم دیگه چه راه هایی هست که این کار رو انجام بدم؟ آیا میشه این تابع رو توی رویداد Load فرم یک بزارم و از فرم دوم این رویداد رو فراخوانی بکنم؟ چطور؟

mr.sirwan
جمعه 05 شهریور 1395, 23:11 عصر
اولا ایونت FormLoad زمانی فایر میشه که از یکی از متد های Show() و یا ShowDialog() استفاده بشه، ثانیا توصیه میکنم راه اصولی رو پیش بگیرین درغیر اینصورت کل متد رو داخل فرم 2 هم کپی کنین

و اما مشکل اساسی که شما دارین اینه که کنترل radGridView1 داخل فرم1 هستش و شما دارین اون رو مقدار دهی میکنین، که هیچ دخلی به فرم 2 نداره، به همین خاطره که میگم شما باید اعمالتون رو تفکیک کنین و کار رو بندازین رو دوش چندین متد

موفق باشین

ژیار رحیمی
جمعه 05 شهریور 1395, 23:14 عصر
کویری Sql شما دارای مشکل هست شما نیاز به Join دو تا جدول Tbl_Name و Tbl_Address داری با این شیوه نوشتن کویری Select نمیشه از دوجدول رکوردهایی رو از دیتابیس بخوانی.

daniyaltjm
جمعه 05 شهریور 1395, 23:38 عصر
کویری Sql شما دارای مشکل هست شما نیاز به Join دو تا جدول Tbl_Name و Tbl_Address داری با این شیوه نوشتن کویری Select نمیشه از دوجدول رکوردهایی رو از دیتابیس بخوانی.

از چه مورد میگین که کویری دارای مشکل هست؟ برنامه کار میکنه و رکورد ها رو هم نشون میشده! مشکل توی صدا زدن متد از فرم دیگر هست لطفا روش صدا زدن متد از فرم دیگه رو بگید ممنون.

mr.sirwan
جمعه 05 شهریور 1395, 23:55 عصر
دوست عزیز مثل اینکه متوجه نشدین، میگم شما دارین توی متدتون، کنترلی که داخل فرم1 هست رو مقدار دهی میکنین، این کنترل radGridView1 هیچ ربطی به فرم2 نداره، از این شفاف تر؟؟؟!!!!!

daniyaltjm
شنبه 06 شهریور 1395, 00:14 صبح
دوست عزیز مثل اینکه متوجه نشدین، میگم شما دارین توی متدتون، کنترلی که داخل فرم1 هست رو مقدار دهی میکنین، این کنترل radGridView1 هیچ ربطی به فرم2 نداره، از این شفاف تر؟؟؟!!!!!

ببین اصلا کار به این ندارم که radGridView1 در فرم دو هست!! متد من توی فرم یک تعریف شده و من میخوام "از فرم دوم متدی که در فرم یک نوشتم رو اجرا کنم" حالا متد توی فرم یک هست دیگه نه! یا یک کار دیگه اینکه متد رو در رویداد مثلا فرم لود قرار بدم و از فرم دوم "رویداد فرم لود فرم اول" رو صدا بزنم البته بگم که فرم اول هم باز هست و با متد showDialog باز شده همین...

mr.sirwan
شنبه 06 شهریور 1395, 00:20 صبح
ببین اصلا کار به این ندارم که radGridView1 در فرم دو هست!! متد من توی فرم یک تعریف شده و من میخوام "از فرم دوم متدی که در فرم یک نوشتم رو اجرا کنم" حالا متد توی فرم یک هست دیگه نه! یا یک کار دیگه اینکه متد رو در رویداد مثلا فرم لود قرار بدم و از فرم دوم "رویداد فرم لود فرم اول" رو صدا بزنم البته بگم که فرم اول هم باز هست و با متد showDialog باز شده همین...

(بیاین یه لحظه این مشکل شمارو فراموش کنیم و فرض کنیم شما فقط فرم1 رو دارین) مگه نه اینکه داخل فرم1 هم radgridview1 دارین و داخل فرم توسط یک ایونت یا هرچیزی متد Upd رو فراخوانی میکنین و این متد هم مقادیر واکشی شده را داخل کنترل radgridview1 موجود در همین فرم قرار میده؟؟ اگه اشتباه متوجه شدم توجیه بفرمایید

daniyaltjm
شنبه 06 شهریور 1395, 00:26 صبح
(بیاین یه لحظه این مشکل شمارو فراموش کنیم و فرض کنیم شما فقط فرم1 رو دارین) مگه نه اینکه داخل فرم1 هم radgridview1 دارین و داخل فرم توسط یک ایونت یا هرچیزی متد Upd رو فراخوانی میکنین و این متد هم مقادیر واکشی شده را داخل کنترل radgridview1 موجود در همین فرم قرار میده؟؟ اگه اشتباه متوجه شدم توجیه بفرمایید

آره الان فقط میخوام این متد رو از فرم دو صدا بزنم!!!!

mr.sirwan
شنبه 06 شهریور 1395, 00:38 صبح
آره الان فقط میخوام این متد رو از فرم دو صدا بزنم!!!!

خب دوست عزیز، شما قضیه رو اشتباه متوجه شدین، شما دارین یک ابجکت از فرم1 میسازین، این ابجکت تمام خصوصیات، پراپرتی ها، متدها و حتی کنترل های موجود داخل این فرم1 (نه فرم2) رو میسازه و در خودش نگه میداره، وقتی شما توسط این ابجکت متد مدنظرتون رو فراخوانی میکنین، میره و متد مربوطه رو اجرا میکنه تا اینکه میرسه به مقدار دهی مربوط به radGridView1 (حالا از اینجا به بعد رو دقیق بخون و دقت کن)، این ابجکت ما فقط به کنترل هایی که داخل فرم1 هستن دسترسی داره و نمیدونه که شما یک radGridView1 دیگه هم داخل فرم2 دارین، اصلا ازش خبر نداره چون راه و روش شی گرایی همین هستش، هر ابجکت به پراپرتی ها و خصوصیات خودش دسترسی داره ابجکت ما میاد کنترل radGridView1 موجود در فرم1 رو مقدار دهی میکنه و از قصد و نیت شما (اینکه شما میگین این متد باید به صورت هوشمند بفهمه که من منظورم radGridView1 موجود در فرم2 هست، نه فرم1) باخبر نیستش


دیگه نمیدونم چجوری بیان کنم که منظورمو بگیرین

abdullah20
شنبه 06 شهریور 1395, 00:43 صبح
دوست عزیز اصلا بحث کوئری به کنار که درست هستش یا نه
ی سوال
ایا گرید در فرم اصلی هستش و از طریق فرم اصلی میاد فرم 2 را باز میکنید؟
اگر پاسخ مثبت است به این صورت عمل کنید:

Main fMain = (Main)Application.OpenForms["Main"];
fMain.Upd("select ID_Name,Name,Family,Tel,Address from Tbl_Name,Tbl_Address where ID_Name=Prs_ID");

daniyaltjm
شنبه 06 شهریور 1395, 00:59 صبح
خب دوست عزیز، شما قضیه رو اشتباه متوجه شدین، شما دارین یک ابجکت از فرم1 میسازین، این ابجکت تمام خصوصیات، پراپرتی ها، متدها و حتی کنترل های موجود داخل این فرم1 (نه فرم2) رو میسازه و در خودش نگه میداره، وقتی شما توسط این ابجکت متد مدنظرتون رو فراخوانی میکنین، میره و متد مربوطه رو اجرا میکنه تا اینکه میرسه به مقدار دهی مربوط به radGridView1 (حالا از اینجا به بعد رو دقیق بخون و دقت کن)، این ابجکت ما فقط به کنترل هایی که داخل فرم1 هستن دسترسی داره و نمیدونه که شما یک radGridView1 دیگه هم داخل فرم2 دارین، اصلا ازش خبر نداره چون راه و روش شی گرایی همین هستش، هر ابجکت به پراپرتی ها و خصوصیات خودش دسترسی داره ابجکت ما میاد کنترل radGridView1 موجود در فرم1 رو مقدار دهی میکنه و از قصد و نیت شما (اینکه شما میگین این متد باید به صورت هوشمند بفهمه که من منظورم radGridView1 موجود در فرم2 هست، نه فرم1) باخبر نیستش


دیگه نمیدونم چجوری بیان کنم که منظورمو بگیرین

دوست عزیز من کی گفتم radGridView1 من توی فرم دو هست؟!!! radGridView1 توی فرم یک هست، ببین من وقتی فرم دو رو باز میکنم یک پنجره کوچیک دارم و وقتی فیلدها رو پر کردم و دکمه "ذخیره" رو زدم می خوام radGridView1 " توی فرم یکم" آپدیت بشه و من اصلا هیچ radGridView1 در فرم دومم ندارم!!!

daniyaltjm
شنبه 06 شهریور 1395, 02:47 صبح
دوست عزیز اصلا بحث کوئری به کنار که درست هستش یا نه
ی سوال
ایا گرید در فرم اصلی هستش و از طریق فرم اصلی میاد فرم 2 را باز میکنید؟
اگر پاسخ مثبت است به این صورت عمل کنید:

Main fMain = (Main)Application.OpenForms["Main"];
fMain.Upd("select ID_Name,Name,Family,Tel,Address from Tbl_Name,Tbl_Address where ID_Name=Prs_ID");

آره دقیقا، جواب داد ولی یه سوال: چرا در کد من که یک شی از فرم ساختم و متد رو فراخوانی کردم جواب نداد! ولی با کد شما جواب داد؟
این خط رو توضیح میدین؟
Main fMain = (Main)Application.OpenForms["Main"];

abdullah20
شنبه 06 شهریور 1395, 12:45 عصر
خب فرم اصلی باز هستش وشما دارید دوباره ازش نمونه میسازی
این کد در کل برنامه سرچ میکنه و اگر فرمی بازی با نام Main پیدا کرد براتون برمیگردونه

Mahmoud.Afrad
شنبه 06 شهریور 1395, 15:34 عصر
دوست عزیز اصلا بحث کوئری به کنار که درست هستش یا نه
ی سوال
ایا گرید در فرم اصلی هستش و از طریق فرم اصلی میاد فرم 2 را باز میکنید؟
اگر پاسخ مثبت است به این صورت عمل کنید:

Main fMain = (Main)Application.OpenForms["Main"];
fMain.Upd("select ID_Name,Name,Family,Tel,Address from Tbl_Name,Tbl_Address where ID_Name=Prs_ID");

بهتره یک ارجاع از فرم1 در فرم2 داشته باشید(یا از طریق Parent فرم2 عمل کنید) و از اون استفاده کنید تا در صورت تغییر نام فرم، کدتون به مشکل نخوره.
یا کلا از الگوی سینگلتون استفاده کنید.

daniyaltjm
شنبه 06 شهریور 1395, 16:57 عصر
بهتره یک ارجاع از فرم1 در فرم2 داشته باشید(یا از طریق Parent فرم2 عمل کنید) و از اون استفاده کنید تا در صورت تغییر نام فرم، کدتون به مشکل نخوره.
یا کلا از الگوی سینگلتون استفاده کنید.

بسیار خوب، کدهای این توضیحاتی که گفتین رو هم بزارید.

omid nasri
شنبه 06 شهریور 1395, 18:57 عصر
دوست عزیز پیشنهاد میکنم بجای کش دادن این پست با نحوه دیباگ کردن پروژه آشنا بشید، در پایان بعد از آشنایی همین متد رو دیباگ کنید.