PDA

View Full Version : سوال: ShowDialog فقط فرم Child زیری خودش را غیر فعال کند نه کل برنامه را



Javad_raouf
سه شنبه 03 اسفند 1389, 16:05 عصر
سلام و خسته نباشید
سه تا فرم داریم به نام های:
main
child
mjDialog

فرم main فرم مادر هست ، فرم child فرم فرزند main و فرم mjDialog یک فرم آزاد است

حال همانطور که می دانید ما می توانیم در فرم Main بی نهایت بار فرم child را باز کنیم و همه را در کنار هم ردیف کنیم....
حالا ما دو تا فرم child باز کردیم

توی فرم child 1 روی یک دکمه که کلیک می کنیم فرم mjDialog به صورت showDialog باز می شود.

همانطور که همه می دانیم دلیل اینکه به صورت ShowDialog باز می شود این است که تا وقتی بسته نشده کاربر نتواند به فرم child 1 دسترسی داشته باشد

ولی مشکلی که من دارم اینه که تا وقتی فرم mjDialog بسته نشده کاربر به کل برنامه نمی تونه دسترسی داشته باشه یعنی نمی توان به فرم child 2 هم دسترسی داشت . حتی به فرم Main هم نمی توان دسترسی داشت.

آیا راهی هست که وقتی فرم mjDialog باز می شود فقط فرم child 1 رو قفل کنه و بقیه فرم ها آزاد باشند؟؟؟؟؟

#aliyari_C
چهارشنبه 04 اسفند 1389, 18:11 عصر
سلام
مي توني از Theard استفاده كني , يك مثال ساده برات مي زنم بقيش با خودت

در فرم Main


private void button1_Click(object sender, EventArgs e)
{


Thread t = new Thread(fun);

t.Start();

}
public static void fun()
{
Application.Run(new Form2());
}
بعدش در فرم 2


private void button1_Click(object sender, EventArgs e)
{
Form3 f = new Form3();
f.ShowDialog();

}


اينم يك مثال ديگه (از اينجا كش رفتم) http://stackoverflow.com/questions/428494/is-it-possible-to-use-showdialog-without-blocking-all-forms



[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Button loadB, loadC;
Form formA = new Form
{
Text = "Form A",
Controls = {
(loadC = new Button { Text = "Load C", Dock = DockStyle.Top}),
(loadB = new Button { Text = "Load B", Dock = DockStyle.Top})
}
};
loadC.Click += delegate
{
Form formC = new Form { Text = "Form C" };
formC.Show(formA);
};
loadB.Click += delegate
{
Thread thread = new Thread(() =>
{
Button loadD;
Form formB = new Form
{
Text = "Form B",
Controls = {
(loadD = new Button { Text = "Load D",
Dock = DockStyle.Top})
}
};
loadD.Click += delegate
{
Form formD = new Form { Text = "Form D" };
formD.ShowDialog(formB);
};
formB.ShowDialog(); // no owner; ShowDialog to prevent exit
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
};
Application.Run(formA);
}


موفق باشي

Javad_raouf
پنج شنبه 05 اسفند 1389, 16:10 عصر
مرسی ولی مشکل اینجاست که وقتی از Thread استفاده می کنی دیگه نمیتونی MdiParent فرم 2 رو بدی به فرم 1

exlord
پنج شنبه 05 اسفند 1389, 16:50 عصر
public Form Parent { get; set; }
public Form3(Form parent)
{
InitializeComponent();
this.Parent = parent;
this.Parent.Enabled = false;
}
private void Form3_FormClosing(object sender, FormClosingEventArgs e)
{
this.Parent.Enabled = true;
this.Parent.Focus();
}

Javad_raouf
شنبه 07 اسفند 1389, 18:08 عصر
مرسی
میشه یکم بیشتر توضیح بدین؟

exlord
شنبه 07 اسفند 1389, 21:00 عصر
مرسی
میشه یکم بیشتر توضیح بدین؟

توی constructor فرم فرزند , فرم پدر رو enable = false کن ...
توی form_closing فرم فرزند فرم پدر رو enable = true و Focus کن ...

چیزه خیلی ساده ایه ... به نظر خودمم کدشم خیلی واضح و خواناس ..

Javad_raouf
چهارشنبه 11 اسفند 1389, 12:11 عصر
ما که هر کار کردیم جواب نگرفتیم
اگهیک Sample بذارید ممنون میشم

Javad_raouf
شنبه 14 اسفند 1389, 17:52 عصر
دوستان
کس دیگه ای نظر نداره؟