c#,winform,show,showdialog,子表單,父表單,傳值,輸入正確
表單的show方法,沒有給調用代碼任何通知,如果需要通知,使用showdialog是一種好的選擇。
在調用show方法後,show方法後面的代碼會立即執行,調用showdialog方法後,調用代碼被暫停執行,等到調用showdialog方法的表單關係後再繼續執行。而且表單可以返回一個dialogresult值,他描述了表單關閉的原因,例如OK,Cancel,yes,no等。為了讓表單返回一個dialogresult,必須設置表單的dialogresult值,或者在表單的一個按鈕上設置dialogresult屬性。
例子:
下面是子表單代碼,要求輸入phone,然後會返回給父表單。
- namespace WindowsApplication1
- {
- public partial class Phone : Form
- {
- public Phone()
- {
- InitializeComponent();
- btnOK.DialogResult = DialogResult.OK;
- btnOK.DialogResult = DialogResult.Cancel;
- }
- public string PhoneNumber
- {
- get { return textBox1.Text; }
- set { textBox1.Text = value; }
- }
- private void Phone_Load(object sender, EventArgs e)
- {
- }
- }
- }
複製代碼 不包含任何處理按鈕按一下事件的代碼,因為設置了每個按鈕的dialogresult屬性,所以按一下OK或者Cancel按鈕後,表單就消失了。下面的代碼顯示了父表單中調用Phone對話方塊的方法。
- namespace WindowsApplication1
- {
- public partial class Form7 : Form
- {
- public Form7()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- Phone frm = new Phone();
- frm.ShowDialog();
- if (frm.DialogResult == DialogResult.OK)
- {
- label1.Text = "Phone number is " + frm.PhoneNumber;
-
- }
- else if (frm.DialogResult == DialogResult.Cancel)
- {
- label1.Text = "form was canceled";
-
- }
- frm.Close();
- }
- }
- }
複製代碼 看起來非常簡單,創建新的Phone物件frm,在調用frm.showdialog方法是,代碼停止,等待phone表單返回,接著檢查phone表單的dialogresult屬性,由於表單還沒有釋放,是不可見的,所以仍可以訪問公共屬性phonenumber,一旦獲取了需要的資料,就可以調用表單的close方法。
一切正常,但是如果返回的格式不正確怎麼辦,就要把showdialog方法放在迴圈中,就可以再次調用,讓用戶重新輸入,就可以得到正確的值。
上面的代碼改成下面的即可。
- namespace WindowsApplication1
- {
- public partial class Form7 : Form
- {
- public Form7()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- Phone frm = new Phone();
- while (true)
- {
- frm.ShowDialog();
- if (frm.DialogResult == DialogResult.OK)
- {
- label1.Text = "Phone number is " + frm.PhoneNumber;
- if (frm.PhoneNumber.Length == 8 || frm.PhoneNumber.Length == 12)
- {
- break;
- }
- else
- {
- MessageBox.Show("");
- }
- }
- else if (frm.DialogResult == DialogResult.Cancel)
- {
- label1.Text = "form was canceled";
- break;
- }
- }
- frm.Close();
- }
- }
- }
複製代碼 |