PDA

View Full Version : سوال: کنترل یک event در داخل usercontrol



zarrinnegar
یک شنبه 15 خرداد 1390, 15:42 عصر
سلام به دوستان
من یک مشکلی دارم که در تاپیک های دیگه نتونستم پیدا کنم

من 2 تا usercontrol ساختم
یکی از اونها توش یک datagridview هست که از دیتابیس یک جدول رو میخونه و پر میکنه
یکی دیگه چند تا textbox داره که محتویات یک رکورد رو نمایش میده

توی فرم اصلیم 2 تا container دارم که زمان لود برنامه او 2 تا usercontrol رو به اون اضافه میکنم

حالا میخوام اگه کاربر روی هر رکوردی کلیک کرد (از datagridview) توی usercontrol بعدی اطلاعات اون رکورد نمایش داده شه
البته توی usercontrolدوم یک زیر برنامه نوشتم که یک کد بعنوان ورودی میگیره و بعد توی جدول میگرده و بعد از پیدا کردن اطلاعات رو توی textbox ها نمایش میده
ولی نمیدونم چطوری باید تو فرم اصلیم کد رو از usercontrol اول بگیرم و بعد از این که گرفتم به دومی پاس بدم که اطلاعاتش refresh بشه

ممنون میشم کمکم کنید
البته با C#

morteza271
یک شنبه 15 خرداد 1390, 16:32 عصر
شما باید در فرمی که تکست باکس ها هستن یه رویداد برای تغییر سطر انتخابی گرید فرم اولتون بنویسید.
توی رویداد هم میتونید بنویسید که اطلاعات سطر انتخاب شده رو در تکست باکس ها نمایش بده.
اینم کد برای تعریف رویداد :
این کد رو باید در فرمی که تکست باکس ها هستن بنویسید :

UserControl1.dgvCalendar.SelectionChanged +=new EventHandler(dgvCalendar_SelectionChanged);

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

private void dgvCalendar_SelectionChanged(object sender, EventArgs e)
{
// Your code.
}
موفق باشید

exlord
یک شنبه 15 خرداد 1390, 16:37 عصر
توی کنترل 1:
public DataGridView DGV { get { return this.dataGridView1; } }
توی فرم اصلی :
userCon1.DGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);
void DGV_CellClick(object sender, DataGridViewCellEventArgs e)
{
usercon2.ShowData(.....);
}
توی کنترل 2 :
public void ShowData(... parametrs ...)
{
//do your thing
}

zarrinnegar
یک شنبه 15 خرداد 1390, 17:19 عصر
توی فرم اصلی :

1
userCon1.DGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);






این قسمت از کد کجای فرم اصلی نوشته میشه؟

من این کد ها رو برای ساخت استفاده کردم


[LTR]

public Form2()

{




InitializeComponent();





}



public AccountForms.UC_UserGrid ucg = new AccountForms.UC_UserGrid();


public AccountForms.UC_UserInfo uci = new AccountForms.UC_UserInfo();

zarrinnegar
یک شنبه 15 خرداد 1390, 17:21 عصر
توی فرم اصلی :
userCon1.DGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);


این کجای فرم اصلی نوشته میشه؟

zarrinnegar
یک شنبه 15 خرداد 1390, 17:39 عصر
توی کنترل 1:
public DataGridView DGV { get { return this.dataGridView1; } }
توی فرم اصلی :
userCon1.DGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);
void DGV_CellClick(object sender, DataGridViewCellEventArgs e)
{
usercon2.ShowData(.....);
}
توی کنترل 2 :
public void ShowData(... parametrs ...)
{
//do your thing
}



از شما ممنونم
درست شد

حالا یه سوال دیگه

اگه من 30 - 40 تا این تیپی گرید و کنترل تکی داشته باشم باید برای همه اونها در فرم اصلیم این تابع رو بنویسم یا راهی وجود داره که موقعی که صداشون میزنم این قضیه اتفاق بیفته و زمانی که 2 کنترل دیگه ای را صدا میکنم تابع قبلی از بین بره؟

نمیدونم درست تونستم مطرح کنم یا نه

اگه متوجه نشدید بگید واضح تر بگم

ممنون میشم این مشکل رو هم حل کنید

morteza271
یک شنبه 15 خرداد 1390, 17:45 عصر
دوست عزیز با استفاده از کدی که من نوشتم نیازی به کد نویسی در داخل فرم اصلی نیست.
و شما وقتی دو تا UserControl رو بسازین هرجای پروژتون که بذارید براتون این کار رو انجام میدن و لازم نیست در تمامی فرم هاتون این کدها رو بنویسید!
موفق باشید.

zarrinnegar
یک شنبه 15 خرداد 1390, 19:00 عصر
دوست عزیز با استفاده از کدی که من نوشتم نیازی به کد نویسی در داخل فرم اصلی نیست.
و شما وقتی دو تا UserControl رو بسازین هرجای پروژتون که بذارید براتون این کار رو انجام میدن و لازم نیست در تمامی فرم هاتون این کدها رو بنویسید!
موفق باشید.


سلام دوست عزیز
از اینکه راهنمایی کردید متشکرم ولی من منظور شمارا متوجه نشدم
من یک بار دیگه توضیح میدم
من یک usercontrol دارم که توش یه گریده که میخوام وقتی توی فرم اصلی نشونش دادم و کسی روش کلیک کرد یکی از مقادیر داخل گرید رو به فرم اصلیم پاس بده مثلا code
بعد در داخل فرم اصلیم تشخیص بدم که کلیک اتفاق افتاده او code رو که بهم برگردونده رو به usercontrol دوم پاس بدم که بره بگرده اطلاعات مربوط به اون کد رو نمایش بده

توی کدی که شما نوشتید فقط گفتید که هر وقت تغییری رخ داد این کار را بکن
حالا این تابع از کجا می فهمه که گرید من تغییر کرده؟
شاید من متوجه نمیشم اگه میشه راهنمایی کنید

بعدش هم بنا به مقتضیات برنامه ام حدود 40 تا usercontrol گرید با مشخصات متفاوت به همراه 40 تا user control برای نمایش اطلاعات و ورودی دارم

من با کدی که دوستمون exlord ارسال کرده جواب گرفتم ولی باید تابعی رو که گفته توی فرم اصلی بنویس رو مجبورم 40 بار برای 40 فرم بنویسم
اگه راهی هست که مثلا یک تابع عمومی بنویسم و مقادیرش رو بهش پاس کنم و جلوگیری از 40 تابع بشه ممنون میشم کمکم کنید

exlord
یک شنبه 15 خرداد 1390, 19:11 عصر
این 40 تا کنترل همشون توی یه فرمن ؟
نمیتونین 2 تا کنترل رو ( grid و textbox ها ) بکنین یه کنترل ؟

zarrinnegar
یک شنبه 15 خرداد 1390, 19:21 عصر
این 40 تا کنترل همشون توی یه فرمن ؟
نمیتونین 2 تا کنترل رو ( grid و textbox ها ) بکنین یه کنترل ؟ اونوقت میتونین از کد troski استفاده کنین ....



ساتم عزیز
40 تا توی یک فرم نمایش داده میشن
قبل از اینکه هر جفت از اینها نمایش داده شه قبلی حذف میشه
بعدش هم چون از دومی که اطلاعات جزئی رو نمایش میده بار ها تو جا های دیگه استفاده میکنم نمیتونم توی هم بزارمشون
اگر هم اینکار رو کنم مجبورم هی visible گرید رو بردارم و بزارم

یه راهنمایی:
شما دموی برنامه جانوس رو دیدید؟
به نام
NorthwindDemo2007

میخوام مثل اون برنامه نویسی کنم

exlord
یک شنبه 15 خرداد 1390, 19:22 عصر
شما باید در فرمی که تکست باکس ها هستن یه رویداد برای تغییر سطر انتخابی گرید فرم اولتون بنویسید.
توی رویداد هم میتونید بنویسید که اطلاعات سطر انتخاب شده رو در تکست باکس ها نمایش بده.
اینم کد برای تعریف رویداد :
این کد رو باید در فرمی که تکست باکس ها هستن بنویسید :

UserControl1.dgvCalendar.SelectionChanged +=new EventHandler(dgvCalendar_SelectionChanged);

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

private void dgvCalendar_SelectionChanged(object sender, EventArgs e)
{
// Your code.
}
موفق باشید
dgvCalendar باید static تعریف بشه تا این کد جواب بده ...

exlord
یک شنبه 15 خرداد 1390, 19:39 عصر
قبل از اینکه هر جفت از اینها نمایش داده شه قبلی حذف میشه

oخوب پس همزمان وقت یک جفت از اینا تو فرم هست ... در این صورت :
همه اینا تو فرم اصلی :
private UserControl1 activeUsercontrol1;
private UserControl2 activeUsercontrol2;

this.ControlAdded += new ControlEventHandler(Form2_ControlAdded);
this.ControlRemoved += new ControlEventHandler(Form2_ControlRemoved);

void Form2_ControlRemoved(object sender, ControlEventArgs e)
{
if (e.Control is UserControl1)
this.activeUsercontrol1 = null;
if (e.Control is UserControl2)
this.activeUsercontrol2 = null;
}

void Form2_ControlAdded(object sender, ControlEventArgs e)
{
if (e.Control is UserControl1)
this.activeUsercontrol1 = e.Control as UserControl1;
if(e.Control is UserControl2)
this.activeUsercontrol2 = e.Control as UserControl2;

if (activeUsercontrol1 != null && activeUsercontrol2 != null)
{
activeUsercontrol1.DGV.CellClick += DGV_CellClick;
}
}

void DGV_CellClick(object sender, DataGridViewCellEventArgs e)
{
activeUsercontrol2.ShowData(.......);
}

zarrinnegar
یک شنبه 15 خرداد 1390, 19:56 عصر
:چشمک:درسته
ممنونم

فقط یه سوال خیلی ساده

پس من هر وقت بخوام جفت کنترل هام رو صدا بزنم و در واقع لود کنم از دو تابع Form2_ControlRemoved و Form2_ControlAdded با مقدار نام کنترل استفاده کنم ؟

exlord
یک شنبه 15 خرداد 1390, 21:43 عصر
:چشمک:
پس من هر وقت بخوام جفت کنترل هام رو صدا بزنم و در واقع لود کنم از دو تابع Form2_ControlRemoved و Form2_ControlAdded با مقدار نام کنترل استفاده کنم ؟
نخیر ... شما فقط یک بار این کدهارو تو فرم بزارین ... بقییش automatic انجام میشه ...

zarrinnegar
یک شنبه 15 خرداد 1390, 21:47 عصر
شرمنده که میپرسم
پس چطوری از منو های برنامه ام usercontrol هام رو صدا کنم ؟ که با این کد ها اتوماتیک کار کنه

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

ممنون که جواب میدی

zarrinnegar
یک شنبه 15 خرداد 1390, 23:37 عصر
چی شد؟

رفتی؟

exlord
دوشنبه 16 خرداد 1390, 09:03 صبح
پس چطوری از منو های برنامه ام usercontrol هام رو صدا کنم ؟ که با این کد ها اتوماتیک کار کنه

معنی Automatic رو تو دیکشنری پیدا کنین ...
private UserControl1 activeUsercontrol1;
private UserControl2 activeUsercontrol2;
public Form2()
{
this.ControlAdded += new ControlEventHandler(Form2_ControlAdded);
this.ControlRemoved += new ControlEventHandler(Form2_ControlRemoved);
InitializeComponent();
}
void Form2_ControlAdded(object sender, ControlEventArgs e)
{
if (e.Control is Panel || e.Control is GroupBox)
{
e.Control.ControlAdded += Form2_ControlAdded;
e.Control.ControlRemoved += Form2_ControlRemoved;
}
else if (e.Control is UserControl1)
this.activeUsercontrol1 = e.Control as UserControl1;
else if (e.Control is UserControl2)
this.activeUsercontrol2 = e.Control as UserControl2;

if (activeUsercontrol1 != null && activeUsercontrol2 != null)
{
activeUsercontrol1.DGV.CellClick += DGV_CellClick;
}
}
void Form2_ControlRemoved(object sender, ControlEventArgs e)
{
if (e.Control is UserControl1)
this.activeUsercontrol1 = null;
if (e.Control is UserControl2)
this.activeUsercontrol2 = null;
}
void DGV_CellClick(object sender, DataGridViewCellEventArgs e)
{
activeUsercontrol2.ShowData(.......);
}

شما هر بار که یه کنترل به فرم اضافه کنین ( this.Controls.Add(...); ) اونت ControlAdded اجرا میشه ... تو این کد با متد Form2_ControlAdded این اونت رو Handle میکنیم ....
e.Control کنترلیی که به فرم اضافه شده شده .... چک میکنیم اگه از نوع UserControl1 یا UserControl2 باشه( e.Control is UserControl1 ) رفرنسشو توی یه متغیر محلی نگه میداریم ...( this.activeUsercontrol1 = e.Control as UserControl1; )

بعد چک میکنیم اگه هر دوی این کنترل ها روی فرم هستن اونت هندلر لازمرو ست میکنیم ... ( activeUsercontrol1.DGV.CellClick += DGV_CellClick; )

وسلام و علیکم ...