2009-07-15 30 views
59

Làm cách nào để vô hiệu hóa biểu mẫu gốc khi biểu mẫu con đang hoạt động bằng C#?Làm cách nào để vô hiệu hóa biểu mẫu gốc khi biểu mẫu con đang hoạt động?

+0

Bạn không thể sử dụng ChildForm.show sau đó Mainform.disable/.hide hoặc bạn đang nói về việc có 2 biểu mẫu hoạt động cùng một lúc và khi biểu mẫu con là (hoạt động để tắt chính) sau đó bật lại (không tập trung) kích hoạt mainforM? –

+0

@DonThomasBoyle: hey người đàn ông, tôi đang tìm chính xác giải pháp mô tả của bạn "có 2 hình thức hoạt động cùng một lúc và khi hình thức con là (hoạt động để vô hiệu hóa chính) sau đó trên (unfocus) kích hoạt lại mainforM" bạn có thể cho tôi một gợi ý làm thế nào để giải quyết điều đó? Tôi đã thử nó với luồng, application.run, vv nhưng không có gì hoạt động. làm thế nào bạn sẽ nhận ra điều này? – melodia

Trả lời

161

Bạn đã thử sử dụng Form.ShowDialog() thay vì Form.Show()?

ShowDialog hiển thị cửa sổ của bạn dưới dạng phương thức, có nghĩa là bạn không thể tương tác với biểu mẫu gốc cho đến khi nó đóng.

+0

điều này có ẩn biểu mẫu gốc không? – barlop

+0

@barlop để ẩn biểu mẫu gốc sử dụng 'this.Hide()' trong mã biểu mẫu gốc. – vee

+0

@vee Bạn đã hiểu sai tôi. Tôi đã hỏi tại sao nó dường như ẩn nó (khi tôi không muốn nó). Vấn đề của tôi, đã giải quyết, là http://stackoverflow.com/questions/38171607/c-sharp-winforms-how-can-i-get-the-child-form-in-front-of-parent-form-without này – barlop

33

Bạn đang gọi số ShowDialog() hoặc chỉ Show() trên biểu mẫu con của bạn từ biểu mẫu gốc?

ShowDialog sẽ "chặn" người dùng tương tác với biểu mẫu được chuyển dưới dạng thông số thành ShowDialog.

Trong cha mẹ bạn có thể gọi một cái gì đó như:

MyChildForm childForm = new MyChildForm(); 

childForm.ShowDialog(this); 

nơi this là hình thức mẹ.

+0

Làm việc cho tôi! VB.Net phiên bản này là: 'Công childForm Như New Childformclass' và' childForm.ShowDialog (Me) 'nơi tôi là lớp cha mẹ (hình thức cha mẹ) cảm ơn bạn rất nhiều @Philip –

8

gì bạn có thể làm, là để đảm bảo thông qua form cha là chủ sở hữu khi hiển thị dưới dạng con:

Form newForm = new ChildForm(); 
    newForm.Show(this); 

Sau đó, dưới hình thức trẻ em, thiết lập xử lý sự kiện cho ActivatedDeactivate sự kiện:

private void Form_Activated(object sender, System.EventArgs e) 
{ 
    if (this.Owner != null) 
    { 
     this.Owner.Enabled = false; 
    } 
} 

private void Form_Deactivate(object sender, System.EventArgs e) 
{ 
    if (this.Owner != null) 
    { 
     this.Owner.Enabled = true; 
    } 
} 

Tuy nhiên, điều này sẽ dẫn đến hành vi thật sự kinh khủng; trong khi bạn sẽ không thể quay lại và tương tác với biểu mẫu gốc ngay lập tức, kích hoạt bất kỳ ứng dụng nào khác sẽ bật nó, và sau đó người dùng có thể tương tác với nó.

Nếu bạn muốn làm cho hình thức con modal, sử dụng ShowDialog thay vì:

Form newForm = new ChildForm(); 
    newForm.ShowDialog(this); 
+0

Bạn cũng có thể xử lý Form_Closed thay vì Form_Deactivate, nếu bạn muốn vô hiệu hóa biểu mẫu gốc cho toàn bộ vòng đời của biểu mẫu con, bất kể các biểu mẫu hoặc ứng dụng nào khác đang được kích hoạt trong thời gian đó. – JamesFaix

-2

Tại sao không chỉ có phụ huynh chờ đợi cho đứa trẻ để đóng. Đây là nhiều hơn bạn cần.

// Execute child process 
System.Diagnostics.Process proc = 
    System.Diagnostics.Process.Start("notepad.exe"); 
proc.WaitForExit(); 
+1

-1: Đừng bao giờ dám làm điều đó trong các trình xử lý nhấn/bấm/chuột /. Thông tin: http://stackoverflow.com/questions/470256/process-waitforexit-asynchronously – quetzalcoatl

+0

Câu trả lời này là về QUY TRÌNH, không phải về FORMS. Hữu ích cho ai đó, nhưng không giải quyết được câu hỏi. Nó cũng là một ý tưởng tồi, nếu được thực hiện trên GUI GUI - GUI ứng dụng của bạn sẽ bị khóa cho đến khi quá trình khác trả về - nếu có gì sai, người dùng sẽ phải sử dụng trình quản lý tác vụ để giết ứng dụng của bạn. SỬ DỤNG CẨN THẬN! Hoặc thậm chí tốt hơn: sử dụng một số giải pháp ASYNCHRONOUS, thay vì WaitForExit. – ToolmakerSteve

7

Trong khi sử dụng childForm.ShowDialog (điều này) sẽ vô hiệu hóa biểu mẫu chính của bạn, nó vẫn trông rất bị vô hiệu hóa. Tuy nhiên, nếu bạn gọi Enabled = false trước ShowDialog() và Enable = true sau khi bạn gọi ShowDialog() thì form chính sẽ giống như nó bị vô hiệu hóa.

var childForm = new Form(); 
Enabled = false; 
childForm .ShowDialog(this); 
Enabled = true; 
+0

Tôi không thấy làm thế nào điều này có thể làm việc .. khi tôi thử nó ẩn hình thức cha mẹ – barlop

4
Form1 frmnew = new Form1(); 
frmnew.ShowDialog(); 
2

Bạn cũng có thể sử dụng mẫu MDIParent con. Đặt mẹ dưới hình thức con như MDI Chánh

Ví dụ

child.MdiParent = parentForm; 
child.Show(); 

Trong trường hợp này chỉ là 1 hình thức sẽ được hiển thị và các hình thức con sẽ đến bên cha mẹ. Hope this helps

13

của nó đơn giản, sử dụng

Form.ShowDialog(); 

Thay vào đó

Form.Show(); 

Trong khi sử dụng Form.ShowDialog() bạn không thể tương tác với form cha cho đến khi nó đóng cửa.

+0

khi tôi thử nó tôi thấy rằng giấu nó – barlop

4

@Melodia

Xin lỗi vì đây không phải là mã C# nhưng đây là những gì bạn muốn, bên cạnh dịch này nên được dễ dàng.

Form1

Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter 
    Me.Focus() 
    Me.Enabled = True 
    Form2.Enabled = False 
End Sub 

Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave 
    Form2.Enabled = True 
    Form2.Focus() 
End Sub 

Form2

Private Sub Form2_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter 
    Me.Focus() 
    Me.Enabled = True 
    Form1.Enabled = False 
End Sub 

Private Sub Form2_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave 
    Form1.Enabled = True 
    Form1.Focus() 
End Sub 

Hope this helps

+0

cảm ơn rất nhiều! ý tưởng của bạn là tuyệt vời! tôi chỉ phát hiện ra rằng nó cũng hoạt động bằng cách làm việc với các hình thức-cha mẹ và docking trẻ em với họ. – melodia

1

Đối với tôi công việc này ví dụ ở đây những gì xảy ra là menu chính sẽ bị vô hiệu khi bạn mở mẫu đăng ký.

frmUserRegistration frmMainMenu = new frmUserRegistration(); 
    frmMainMenu.ShowDialog(this); 
0

Nếu bạn đang cố gắng để mô phỏng một cuộc gọi Form.ShowDialog nhưng KHÔNG chặn bất cứ điều gì (kinda giống như một mẫu Dialog mô phỏng), bạn có thể thử sử dụng Form.Show() và ngay sau khi bạn hiển thị dưới dạng hộp thoại mô phỏng sau đó ngay lập tức vô hiệu hóa tất cả các cửa sổ khác sử dụng một cái gì đó giống như ...

private void DisableAllWindows() 
{ 
foreach (Form f in Application.OpenForms) 
if (f.Name != this.Name)f.Enabled = false; 
else f.Focus(); 
} 

sau đó, khi bạn đóng "hình thức giả thoại" bạn hãy chắc chắn để gọi ....

private void EnableAllWindows() 
{ 
foreach (Form f in Application.OpenForms) f.Enabled = true; 
} 
1

bạn có thể làm t mũ.

Form3 formshow = new Form3();

formshow.ShowDialog();

Các vấn đề liên quan