PDA

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



Iman7228
پنج شنبه 18 آبان 1396, 13:46 عصر
سلام دوستان.
من یک فرم جستجو دارم که توش یه دیتاگرید هست.وقتی کاربر از فرم دیگه ای به این فرم مراجعه کنه و روی یکی از سطرها کلیک کنه، اطلاعات این سطر از دیتاگرید به فرم قبلی بازگشت داده میشه.
حالا آیا راهی داره که کاربر از هر فرمی که وارد این فرم جستجو میشه، اطلاعات دیتاگرید به همون فرم برگرده؟

رامین مرادی
شنبه 20 آبان 1396, 10:14 صبح
با یه شرط تقریبا میتونید همچین کاری بکنید.
وقتی فرم جستجو باز میشه نام فرم باز کننده رو هم بهش بفرست بعد از انجام عملیات وقتی رو موردی کلیک میکنی با یه سوییچ یا if بررسی کن از کدوم فرم درخواست شده و داده ها رو به اون فرم برگردون

Iman7228
شنبه 20 آبان 1396, 15:53 عصر
اگه میشه یه مثال(کدنویسی) بزنی ممنون میشم

hamid_hr
شنبه 20 آبان 1396, 17:27 عصر
یک راهش اینه که مثل opendialog باهاش برخورد کنید
یک کلاس ایجاد تا وقتی کاربر یک سطر رو انتخاب کرد مقادیر انتخاب شده رو در خودش نگه داره
و از فرم مبدا بصورت showdialog بازش کنین وقتی فرم بشته شد برین او کلاس رو چک کنین ببینین اطلاعات داره یا نه اگه اطلاعات داشت بعنی کاربر اون سطر رو انتخاب کرده و از اطلاعات استفاده میکنین

حسین.کاظمی
شنبه 20 آبان 1396, 17:31 عصر
راه و روش انتقال اطلاعات بین فرم هاتون را میگید بیزحمت تا بهتر بشه راهنماییتون کرد.

Iman7228
شنبه 20 آبان 1396, 22:42 عصر
راه و روش انتقال اطلاعات بین فرم هاتون را میگید بیزحمت تا بهتر بشه راهنماییتون کرد.

من ازین کد دارم استفاده میکنم.
برای هر فرمی، یه فرم جستجوی جداگانه طراحی کردم. در صورتی که میشه برای همه ی فرم ها از یک فرم جستجو استفاده کرد.






private void dataGridViewX1_CellClick(object sender, DataGridViewCellEventArgs e)
{


VarizBardashtFrm vrzbrdfrm = new VarizBardashtFrm();
vrzbrdfrm.txtshhesab.Text = Convert.ToString(dataGridViewX1.CurrentRow.Cells["shhesab"].Value);
vrzbrdfrm.lblSahebhesab.Text = Convert.ToString(dataGridViewX1.CurrentRow.Cells["name"].Value) + " " + Convert.ToString(dataGridViewX1.CurrentRow.Cells["family"].Value);
this.Hide();
vrzbrdfrm.ShowDialog();


}

mr.sirwan
شنبه 20 آبان 1396, 23:51 عصر
بهترین و حرفه ای ترین روش استفاده از custom event هستش، یعنی شما یه ایونت مینویسین که هر موقع روی سطر موردنظر روی دیتاگریدویو کلیک شد، فرم جستجو بسته بشه و اطلاعات موردنیاز در قالب یک Custom EventArgs به فرم دنبال کننده (همون فرمی که میخواین اطلاعات بهش بازگشت داده بشه) پاس بدین

به فرم یا کلاسی که ایونت رو داخلش تعریف میکنیم اصطلاحا میگیم publisher یا انتشار دهنده و به فرم و یا کلاسی که میخوایم اطلاعات بازگشتی از ایونت رو دریافت کنیم اصطلاحا میگیم subscriber یا دنبال کننده

رامین مرادی
یک شنبه 21 آبان 1396, 08:08 صبح
بهترین و حرفه ای ترین روش استفاده از custom event هستش، یعنی شما یه ایونت مینویسین که هر موقع روی سطر موردنظر روی دیتاگریدویو کلیک شد، فرم جستجو بسته بشه و اطلاعات موردنیاز در قالب یک Custom EventArgs به فرم دنبال کننده (همون فرمی که میخواین اطلاعات بهش بازگشت داده بشه) پاس بدین

به فرم یا کلاسی که ایونت رو داخلش تعریف میکنیم اصطلاحا میگیم publisher یا انتشار دهنده و به فرم و یا کلاسی که میخوایم اطلاعات بازگشتی از ایونت رو دریافت کنیم اصطلاحا میگیم subscriber یا دنبال کننده

راجب این موضوع بیشتر توضیح بدید من خودم مشتاق شدم. اولین باره به گوشم خورد.(خودم با متغییر های ایستا تا بحال اطلاعات رو پاس میدادم)

رامین مرادی
یک شنبه 21 آبان 1396, 08:16 صبح
اگه میشه یه مثال(کدنویسی) بزنی ممنون میشم

اینم تقریبا ساده ترین روش

Iman7228
یک شنبه 21 آبان 1396, 17:04 عصر
بهترین و حرفه ای ترین روش استفاده از custom event هستش، یعنی شما یه ایونت مینویسین که هر موقع روی سطر موردنظر روی دیتاگریدویو کلیک شد، فرم جستجو بسته بشه و اطلاعات موردنیاز در قالب یک Custom EventArgs به فرم دنبال کننده (همون فرمی که میخواین اطلاعات بهش بازگشت داده بشه) پاس بدین

به فرم یا کلاسی که ایونت رو داخلش تعریف میکنیم اصطلاحا میگیم publisher یا انتشار دهنده و به فرم و یا کلاسی که میخوایم اطلاعات بازگشتی از ایونت رو دریافت کنیم اصطلاحا میگیم subscriber یا دنبال کننده

رفتم دنبالش ببینم چیه.ممنون




اینم تقریبا ساده ترین روش

ممنون از شما

mr.sirwan
یک شنبه 21 آبان 1396, 21:13 عصر
برای انجام اینکار توسط ایونت باید سه مرحله انجام بدیم:
1. تعریف Delegate
2. تعریف ایونت بر اساس اون دلیگیت
3. فراخوانی ایونت

خب برای مرحله اول لازمه که توی فرم جستجو (کلاس پابلیشر یا انتشاردهنده) همسطح کلاس، یه delegate با signature زیر تعریف کنیم:
public delegate void SearchEventHandler(object sender, EventArgs args);

پس ایونتی که استفاده میکنیم باید از این signature تبعیت کنه، یعنی ریترن تایپش void باشه، دوتا پارامتر بگیره، اولی از جنس ابجکت و مشخص کننده کلاسیه که این ایونت رو ازش فراخونی میکنیم، دومین پارامتر از جنس کلاس EventArgs که شامل دیتا و اطلاعاتی میشه که لازم داریم (شما باید یه کلاس کاستوم برای eventargs بنویسین که اون اطلاعاتی که لازم دارین رو در خودش داشته باشه، در ادامه این رو هم توضیح میدم)

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


public event SearchEventHandler ItemSelected;

مرخله دوم هم تموم شد.

حالا میرسیم به مرحله سوم، برای فراخوانی ایونت، باید یه متد تعریف کنیم که مسئول فراخوانی ایونت هستش، پس یه متد با signature زیر تعریف میکنیم:

protected virtual void OnItemSelected(EventArgs args)
{
if(ItemSelected != null)
{
ItemSelected(this, args);
}
}

توضیح متد بالا اینه که اگر اون ایونتی که تعریف کردیم دنبال کننده ای داشته باشه (یعنی توی کلاس یا فرم دیگه ای این ایونت رو فراخوانی کرده باشیم یا اصطلاحا ایونتمون فایر(fire) شده باشه) مخالف null میشه و داخل بدنه if اون رو دقیقا مثل یک متد معمولی فراخوانی میکنیم تا دنبال کننده ها رو از این ایونت باخبر کنیم، اما باید از اون signature که برای دلیگیت تعریف کردیم تبعیت کنه، پس پارامتر اول میشه کلاسی که ایونت رو فایر میکنه یعنی کلاس جاری (فرم جستجو)، پارامتر دوم هم شامل اطلاعات موردنیازمون هستش.

اگر ایونتمون دنبال کننده ای نداشته باشه، ایونت برابر null خواهد بود.

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


OnItemSelected(new EventArgs { AccountNumber = Convert.ToString(dataGridViewX1.CurrentRow.Cells["shhesab"].Value), AccountOwner = // get the Account Owner });

الان ما به فرم جستجومون (که ایونت رو داخل اون تعریف کردیم) publisher یا انتشاردهنده میگیم و میتونیم از این ایونت توی هر فرمی که لازم باشه به راحتی استفاده کنیم، نحوه استفاده از این ایونت به شکل زیره، فرضا توی فرم 1 هستیم و لازم داریم که فرم جستجو رو باز کنیم و از ایتمی که توی فرم جستجو انتخاب میشه استفاده کنیم:


var searchingForm = new frmSearchingForm();
searchingForm.ItemSelected += frmSearchingForm_ItemSelected;

private void frmSearchingForm_ItemSelected(object sender, EventArgs args)
{
// now your data is stored in args
}


توی کد بالا به ایونت هندلر frmSearchingForm_ItemSelected که توی فرم 1 داره ایونت ItemSelected توی فرم جستجو رو فراخوانی میکنه میگیم subscriber یا دنبال کننده اون ایونت (به تبع اون به کلاس فرم 1 هم دنبال کننده میگیم)

کار تمومه.

اما حالا درمورد اون کلاس custom eventargs که گفتم، باید یه کلاس تعریف کنید که از کلاس EventArgs ارث بری میکنه، و براش پراپرتی هایی که لازم دارین رو تعریف کنین:


public class SearchEventArgs:EventArgs
{
public string AccountNumber {get; set;}
public string AccountOwner {get; set;}
}

و برای استفاده از این کلاس باید توی کد های بالا، به جای تمامی EventArgs ها از کلاس SearchEventArgs استفاده کنید.

نکته دیگه اینکه شما به جای تعریف یک دلیگیت میتونین از دلیگیت تعریف شده توی خود دات نت استفاده کنین، پس مرحله اول حذف میشه و فقط از مرحله دوم کار رو شروع میکنین، یکی از این دلیگیت های پیش فرض دلیگیت EventHandler هستش که باید از نوع جنریکش استفاده کنید و نوع SearchEventArgs رو بهش بدین، به این صورت:


public event EventHandler<SearchEventArgs> ItemSelected;

اگر از دلیگیت پیشفرض خود دات نت استفاده کنین، میتونین اون دلیگیتی که خودمون تعریف کردیم رو پاک کنین و مستقیما ایونت رو بسازین

اگر بازم مشکلی داشتین بگین راهنمایی کنم

Iman7228
یک شنبه 21 آبان 1396, 23:14 عصر
ممنون از اطلاعات و راهنمایی خوبتون.
آیا نمونه برنامه ای هست که کدشو بخونم؟؟؟

mr.sirwan
یک شنبه 21 آبان 1396, 23:29 عصر
ممنون از اطلاعات و راهنمایی خوبتون.
آیا نمونه برنامه ای هست که کدشو بخونم؟؟؟

الان این توضیحات رو الکی نوشتم یعنی؟ :متفکر:

Iman7228
یک شنبه 21 آبان 1396, 23:41 عصر
الان این توضیحات رو الکی نوشتم یعنی؟ :متفکر:

خدا نکنه.دست و پنجه ت درد نکنه. نکته ای که هست اینه که من اونقدی که شما استادی، وارد نیستم. رو همین حساب باید رو یه سمپل هم کار کنم و کدهاشو بخونم تا دستم بیاد.عذرخواهی میکنم

mr.sirwan
یک شنبه 21 آبان 1396, 23:52 عصر
بسیار خب من در اسرع وقت یه نمونه اماده میکنم و اینجا اپلود میکنم

mr.sirwan
دوشنبه 22 آبان 1396, 21:46 عصر
اینم نمونه برنامه که قولشو داده بودم

147049

Iman7228
دوشنبه 22 آبان 1396, 22:52 عصر
اینم نمونه برنامه که قولشو داده بودم

147049

لطف و محبتت زیاد برادر :بوس:

Iman7228
دوشنبه 29 آبان 1396, 12:32 عصر
من از روش ارسال اسم فرم ها استفاده کردم.بعدش شرط گذاشتم که اگه اسم فرم ارجاعی برابر با لیبل موردنظر باشه، اطلاعات رو به همون فرم ارسال کنه. به اینصورت :

private void SearchBTN_Click(object sender, EventArgs e)
{
SelectFrm slcfrm= new SelectFrm ();
this.Hide();
slcfrm.label1.Text = this.Name.ToString();
slcfrm.ShowDialog();
}


اینهم برای بازگشت به فرم ارجاعی


private void dataGridViewX1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (label1.Text == "Form1")
{
Form1 frm1 = new Form1();
frm1.textbox1.Text = Convert.ToString(dataGridViewX1.CurrentRow.Cells[1].Value);
this.Hide();
frm1.ShowDialog();
}
else if (label1.Text == "Form2")
{
Form2 frm2 = new Form2();
frm2.textbox1.Text = Convert.ToString(dataGridViewX1.CurrentRow.Cells[1].Value);
this.Hide();
frm2.ShowDialog();
}
}

shahryari
دوشنبه 29 آبان 1396, 12:55 عصر
سلام

در فرم 1
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string s = f.textBox1.Text;
}
}



در فرم 2
private void button1_Click(object sender, EventArgs e)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}


modifiers تکست باکس فرم 2 رو پابلیک کن