PDA

View Full Version : دسترسی به متدها و رویدادهای فرم فرزند در MdiParent



kahkeshane2012
چهارشنبه 09 بهمن 1392, 20:09 عصر
با عرض سلام و خسته نباشید.
من یک فرم mdiParent ایجاد کردم که تعدادی فرم فرزند ایجاد شده و در مکان مشخصی از فرم مادر این فرم های فرزند باز میشن؛ حال من میخواهم درون یکی از فرم های فرزند رویداد فرم فرزند را فراخوانی کنم (باتن) که سطح دسترسی اون هم از نوع عمومی تعریف کردم برنامه اجرا میشه اما فرم فراخوانی شده باز نمیشه و فرم قبلی هم بسته میشود. امکانش هست که بگید مشکل کدم کجاست؟؟؟
با تشکر.

public void btnDoreh_Click(object sender, EventArgs e)
{
CloseChildMdiparent();
FrmDoreh frmhj = new FrmDoreh();
frmhj.MdiParent = this;
frmhj.Dock = DockStyle.Fill;
frmhj.Show();
}

private void btnKargah_Click(object sender, EventArgs e)
{
Frmmain m = new Frmmain();
m.btnDoreh_Click(sender, e);
}

babak1368
چهارشنبه 09 بهمن 1392, 20:17 عصر
با سلام
این روش کار شما یعنی صدا کردن رویداد دکمه در داخل رویداد دکمه دیگر پیشنهاد نمیشود
شما در فرم Frmmain یک Action تعریف کنید و آن action رو اینجا صدا بزنید

kahkeshane2012
چهارشنبه 09 بهمن 1392, 21:20 عصر
کاش یه مثال ساده میزدید راجع به Action ؟!؟!؟ البته من خودم یک سرچی زدم راجع به این موضوع و یه مثالی دیدم به صورت: public static void Main()
{ Name testName = new Name("Koani");
Action showMethod = testName.DisplayToWindow;
showMethod(); }

action یعنی واکنش نشان دادن که وقتی ما مثلا بر باتن کلیک کردیم واکنش نمایش یه پیغامی هست که واکنش من اینجا نمایش یک فرم هست؛ یعنی من باید یک واکنش برفرض با نام ShowFrm تعریف کنم؟!؟!؟ تا این ShowFrm را فراخونی کنم؟!؟!

ممنون میشم بیشتر توضیح بدید.
با تشکر.

babak1368
چهارشنبه 09 بهمن 1392, 22:37 عصر
کاش یه مثال ساده میزدید راجع به Action ؟!؟!؟ البته من خودم یک سرچی زدم راجع به این موضوع و یه مثالی دیدم به صورت: public static void Main()
{ Name testName = new Name("Koani");
Action showMethod = testName.DisplayToWindow;
showMethod(); }


action یعنی واکنش نشان دادن که وقتی ما مثلا بر باتن کلیک کردیم واکنش نمایش یه پیغامی هست که واکنش من اینجا نمایش یک فرم هست؛ یعنی من باید یک واکنش برفرض با نام ShowFrm تعریف کنم؟!؟!؟ تا این ShowFrm را فراخونی کنم؟!؟!

ممنون میشم بیشتر توضیح بدید.
با تشکر.



Form1.cs:
publich Action ShowAction{get;set;}

Public Form1()
{
ShowAction=ShowActionFunction;

}

private void ShowActionFunction()
{
this.Show();
}



Form2.cs

private btnShowForm1_Click(object sender,EventArgs e)
{
Form1 from1=new Form1();
form.ShowAction();

}

این یک نمونه کد برای Action می باشد.

kahkeshane2012
چهارشنبه 09 بهمن 1392, 23:47 عصر
اول اینکه ممنونم از همراهیتون.
در واقع تعریف Action همون تعریف خصوصیت (property) است. اما موقعه ی set کردن با خطا مواجه شدم که گفت نمیتونه void را به action تبدیل کنه.

babak1368
پنج شنبه 10 بهمن 1392, 00:42 صبح
اول اینکه ممنونم از همراهیتون.
در واقع تعریف Action همون تعریف خصوصیت (property) است. اما موقعه ی set کردن با خطا مواجه شدم که گفت نمیتونه void را به action تبدیل کنه.
کل کدتون را بزارید اینجا
یک بار دیگه توضیح بدید دقیقا چه کاری میخواید انجام بدید

kahkeshane2012
پنج شنبه 10 بهمن 1392, 10:09 صبح
public void btnDoreh_Click(object sender, EventArgs e)
{
CloseChildMdiparent();
FrmDoreh frmhj = new FrmDoreh();
frmhj.MdiParent = this;
frmhj.Dock = DockStyle.Fill;
frmhj.Show();
}
public Action ShowAction
{
get;
set;
}
public Frmmain()
{
InitializeComponent();
ShowAction = btnDoreh_Click(null,null);
}
(خطا در خط ShowAction = btnDoreh_Click(null,null);)

که من به این صورت هم نوشتم اما جواب نداد.
public Frmmain()
{
InitializeComponent();
ShowAction =(Action) btnDoreh_Click(null,null);
}

babak1368
پنج شنبه 10 بهمن 1392, 12:56 عصر
public void btnDoreh_Click(object sender, EventArgs e)
{
CloseChildMdiparent();
FrmDoreh frmhj = new FrmDoreh();
frmhj.MdiParent = this;
frmhj.Dock = DockStyle.Fill;
frmhj.Show();
}
public Action ShowAction
{
get;
set;
}
public Frmmain()
{
InitializeComponent();
ShowAction = btnDoreh_Click(null,null);
}
(خطا در خط ShowAction = btnDoreh_Click(null,null);)

که من به این صورت هم نوشتم اما جواب نداد.
public Frmmain()
{
InitializeComponent();
ShowAction =(Action) btnDoreh_Click(null,null);
}

برای ShowAction باید یک آدرس تابع با نوع خروجی void بدین نه که رویداد کلیک رو بهش بدید.کدی که من برای Action نوشتم رو یک بار دیگه برسی کنید

kahkeshane2012
پنج شنبه 10 بهمن 1392, 20:42 عصر
مرسی. خطا برطرف شد اما مشکلی که داشتم نه یعنی خروجی با خروجی خودم هیچ فرقی نکرد بازم فرم نمایش داده نمیشود :(

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

babak1368
پنج شنبه 10 بهمن 1392, 22:06 عصر
سلام عزیز
شما باید برای رویداد کلیک اطلاعات دوره دستور بستن همه ی فرزندان را بنویسید سپس در همان رویداد یک instance ازفرم اطلاعات دوره بسازید و تابع Show() ان را فرا بخوانید
البته اگر ناراحت نشید باید بگم طرز طراحی و کد نویسی شما به هیچ صراتی مستقیم نیست.:متفکر:

kahkeshane2012
پنج شنبه 10 بهمن 1392, 22:22 عصر
من یه تابع دارم که همه ی فرزندان بسته میشن؛ البته این تابع قبل از نمایش هر فرمی فراخوانی میشه تا فرم ها روی هم باز نشن اما اگر بخوام که داخل این تابع فراخوانی کنم در فرم های دیگه با مشکل برخورد میکنم مگر اینکه یه جوری این رویداد کلیک مدیریت بشه مثلا با یه if
نه ناراحت برای چی ؛اما طراحیم زیباستا کمی دقت کنید :)

babak1368
پنج شنبه 10 بهمن 1392, 23:46 عصر
من یه تابع دارم که همه ی فرزندان بسته میشن؛ البته این تابع قبل از نمایش هر فرمی فراخوانی میشه تا فرم ها روی هم باز نشن اما اگر بخوام که داخل این تابع فراخوانی کنم در فرم های دیگه با مشکل برخورد میکنم مگر اینکه یه جوری این رویداد کلیک مدیریت بشه مثلا با یه if
نه ناراحت برای چی ؛اما طراحیم زیباستا کمی دقت کنید :)

از نظر طراحی شما یه چیزی به 0 هم بدهکار میشید!:لبخندساده:
ببین من کد مربوط به رویداد کلیک مربوط به اطلاعات دوره را براتون میزارم
اگر نشد بازم بگید
نشد پروژه تونو خواستید بزارید من نگاه کنم

شما برای رویداد کلیک دوره این کد رو بزارید
ببینید این کد داره mdiparent فرم ثبت نام رو میده به mdiParent فرم دوره
از طرفی قبل از اینکه فرم ثبت نام را ببنده این کار انجام میده که در واقع بعد از بسته شدن فرم ثبت نام property مربوط به mdiParent تهی خواهد بود


this.MdiParent.MdiChildren.ToList().ForEach(
x =>
{
if (x != this) x.Close();
});

var form2 = new Form2();
form2.Dock = DockStyle.Fill;
form2.MdiParent = this.MdiParent;

this.Close();
form2.Show();

kahkeshane2012
جمعه 11 بهمن 1392, 09:16 صبح
مرسی از تعریفتون. چقد انگیزه ام زیاد شد.
جواب نداد.