PDA

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



اوبالیت به بو
پنج شنبه 20 بهمن 1390, 12:42 عصر
درود

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

کدهای فرم 1:


private void dgrwOrders_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
try
{
UIL.Classes.StaticVariables._OrderID = Convert.ToInt32(dgrwOrders.Rows[e.RowIndex].Cells["ID"].Value.ToString());
UIL.Classes.StaticVariables._EditMode = 2;
Form frmActionsOrder = new UIL.Order.ActionsOrder();
frmActionsOrder.Show();
}
catch (Exception)
{ }
}

کلاس StaticeVariables پراپرتی را به نام _OrderID دارد که مقدار منحصر به فرد _کلید) جدول را نگه داری می کند. خط اول این مقدار را از گرید داخل این پراپرتی می ریزد. خط دوم مشخص می کند که قرار است در لحظات بعدی فرم شماره 2 در حالت ویرایش باز شود (EditMode = 2). خط شماره 3 یک شی از فرم شماره 2 می سازد و در خط چهار فرم 2 را نمایش می دهد.
در رویداد Load فرم شماره 2 بنده یک Select بوسیله مقدار کلید - که در کلاس StaticeVariables - ذخیره کرده ام را اجرا می کنم. رکورد مورد نظر واکشی می شود و بنده عناصر فرم شماره 2 را به این صورت می خواهم از اطلاعات واکشی شده پر کنم:



DataSet dsOrderInfo = new DataSet();

dsOrderInfo = DAL.Classes.Orders.SelectByID(OrderID);

if (dsOrderInfo.Tables[0].Rows.Count > 0)
{
//نمایش اطلاعات عمومی سفارش
DataRow drOrderInfo = dsOrderInfo.Tables[0].Rows[0];

txtPatientID.Text = drOrderInfo["PatientID"].ToString();
txtPatientID.ReadOnly = true;
lblFullyName.Text = GetPatientName(Convert.ToInt32(txtPatientID.Text)) ;
lblOperator.Text = "ثبت کننده در سیستم: " + drOrderInfo["UserRegisteredName"].ToString();
lblDateTime.Text = "تاریخ ثبت: " + UIL.Classes.PersianDate.ToShamsi(DateTime.Parse(dr OrderInfo["Date"].ToString()));


پس از Trace متوجه شدم دستورات پس از اجرا خط مربوط به if متوقف می شوند و خط فرمان اجرای برنامه به فرم شماره 1 بازگشته و دستور frmActionsOrder.Show(); را اجرا می کند!!!

هنوز متوجه نمی شوم که چرا این اتفاق می افته. اگر خط frmActionsOrder.Show(); در فرم شماره 1 اجرا شده پس یعنی متد مربوطه تمام شده و حالا نوبت به فرم شماره 2 هست. اما نمی دانم چرا وسط اجرای متدی در فرم شماره 2 خط اجرای برنامه دوباره فرم 1 بازگشته دستوری رو که اشاره کردم اجرا می کند.

مشکل از کجاست؟ ممنون می شم اگر بنده رو راهنمایی فرمایید.

majid.gymnast
پنج شنبه 20 بهمن 1390, 18:47 عصر
دوست عزیز من اینکارا رو میکنم:
به تعداد فیلدهایی که قراره بگیرم در فرم دوم متغییر با سطح دسترسی عمومی تعریف میکنم و بعد از کلیک از فرم دومم یه اینستنس میسازم و متغیرهایی رو که تعریف کرده بودم رو مقدارگزاری میکنم و فرمم رو نمایش میدم و آخر کار هم در ایونت لود فرم دومم از متغیرهام هر استفاده ای که خواستم میکنم.

اوبالیت به بو
جمعه 21 بهمن 1390, 12:19 عصر
دوست عزیز من اینکارا رو میکنم:
به تعداد فیلدهایی که قراره بگیرم در فرم دوم متغییر با سطح دسترسی عمومی تعریف میکنم و بعد از کلیک از فرم دومم یه اینستنس میسازم و متغیرهایی رو که تعریف کرده بودم رو مقدارگزاری میکنم و فرمم رو نمایش میدم و آخر کار هم در ایونت لود فرم دومم از متغیرهام هر استفاده ای که خواستم میکنم.


درود بر شما

مساله اینجاست که این دو متد هیچ ربطی بهم دیگه نباید داشته باشند. وقتی که یک فرمی Show میشه یعنی تمام دستوراتی که در فرم قبل اجرا شدن تموم شده رفته. اینکه شما در فرم جدید دارید یک متدی رو اجرا می کنید اما درحین اجرای متد سیستم برگرده و بره متدی از فرم قبلی که باید دستوراتش تموم شده باشه اجرا بشه جایه تعجب داره. نمی فهمم چرا باید این اتفاق بیوفته...

اوبالیت به بو
شنبه 22 بهمن 1390, 16:10 عصر
آیا زمانی که این دستورات اجرا می شوند و فرم 2 نمایش داده می شود هنوز فرم 1 فعال است؟



Form2 obj = new Form2();
obj.ShowDialog();



آیا امکان اینکه از فرم 2 دوباره به این دستورات مراجعه شود وجود دارد یا خیر؟

مهران رسا
یک شنبه 23 بهمن 1390, 12:43 عصر
من هم اخیراً به این مشکل بر خوردم و بسیار عجیب به نظر می رسه. ممنون میشم دوستانی که در این خصوص اطلاعاتی دارن راهنمایی بفرمایند

با تشکر

اوبالیت به بو
شنبه 29 بهمن 1390, 12:05 عصر
درود

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


درود

بنده دوباره کدها رو بررسی کردم و کدهای مربوط به گرید در فرم 1 رو حذف کردم. به طور کل ربطی به گرید فرم 1 نداره. یعنی کدهای گرید باشه یا نباشه فرقی نداره و مساله همچنان حل نشده باقی مانده، یعنی: در هنگام اجرای کدهای درون FormLoad فرم 2، ناگهان خط فرمان به فرم 1 بازگشته و دوباره فرم 2 با اجرای ناقص دستورات نمایش داده می شود.

AmirAmiri
شنبه 29 بهمن 1390, 21:17 عصر
سلام دوست عزیز.
اول پیشنهاد میکنم که دستور شرطی که متوقف میشه رو توی try...catch بنویسی چون احتمال میدم با خطایی مواجه میشه اما به دلایلی خطا رو throw میکنه.
دوم اینکه پیشنهاد میدم روی همون شرط breakpoint بزاری و dsOrderInfo رو بررسی کنی که آیا اصلا Table ای داره یا خیر؟ آیا Table دارای سطری هست یا خیر؟
چون توی فرم اول از try..catch استفاده شده، خطای فرم دوم به فرم اول پاس داده میشه که احتمال میدم catch مربوط به فرم اول اجرا میشه اما چون کدی براش ننوشتید، هیچ پیامی هم دریافت نمیکنید. پیشنهاد میدم درون catch فرم اول یه MessageBox.Show قرار بدید تا از بروز خطا اطمینان پیدا کنید.

خواهش میکنم در صورت رفع مشکلتون حتما اینجا بیان کنید تا تاپیک رو حل شده بدونیم.

موفق و پیروز باشید.

majidrezaei2007
شنبه 29 بهمن 1390, 21:46 عصر
آیا زمانی که این دستورات اجرا می شوند و فرم 2 نمایش داده می شود هنوز فرم 1 فعال است؟



Form2 obj = new Form2();
obj.ShowDialog();



آیا امکان اینکه از فرم 2 دوباره به این دستورات مراجعه شود وجود دارد یا خیر؟


بله . وقتی از دستور ShowDialog استفاده می کنید . فرم جدید به عنوان یک دایلوگ نمایش داده می شود و فرم فعلی پدر اون حساب میشه
زمانی که از این دستور استفاده میکنید فرم 2 باز میشه و فرم اول هنوز باز هست و با بسته شدن فرم 2 کنترل اجرای خطوط برنامه به خط بعد از ShowDialog بر میگرده

اوبالیت به بو
شنبه 13 اسفند 1390, 18:51 عصر
سلام دوست عزیز.
اول پیشنهاد میکنم که دستور شرطی که متوقف میشه رو توی try...catch بنویسی چون احتمال میدم با خطایی مواجه میشه اما به دلایلی خطا رو throw میکنه.
دوم اینکه پیشنهاد میدم روی همون شرط breakpoint بزاری و dsOrderInfo رو بررسی کنی که آیا اصلا Table ای داره یا خیر؟ آیا Table دارای سطری هست یا خیر؟
چون توی فرم اول از try..catch استفاده شده، خطای فرم دوم به فرم اول پاس داده میشه که احتمال میدم catch مربوط به فرم اول اجرا میشه اما چون کدی براش ننوشتید، هیچ پیامی هم دریافت نمیکنید. پیشنهاد میدم درون catch فرم اول یه MessageBox.Show قرار بدید تا از بروز خطا اطمینان پیدا کنید.

خواهش میکنم در صورت رفع مشکلتون حتما اینجا بیان کنید تا تاپیک رو حل شده بدونیم.

موفق و پیروز باشید.


بله . وقتی از دستور ShowDialog استفاده می کنید . فرم جدید به عنوان یک دایلوگ نمایش داده می شود و فرم فعلی پدر اون حساب میشه
زمانی که از این دستور استفاده میکنید فرم 2 باز میشه و فرم اول هنوز باز هست و با بسته شدن فرم 2 کنترل اجرای خطوط برنامه به خط بعد از ShowDialog بر میگرده

درود بر شما

مشکل به این صورت حل شد که خطایی در فرم جدید رخ می داد (یعنی خطا از فرم 1 یا قدیم نبود) اما هیچ پیغام خطایی صادر نمی شد و throw میشد. یک try...catch قرار دادم و در یک msgBox پیغام خطا رو نمایش دادم و متوجه شدم نام یک پارامتر که به sp ارسال می شود اشتباه نوشته شده است. از شما بسیار بسیار سپاسگزارم.