2017-05-19 53 views
0

美好的一天,我檢查了以前的問題,是的,我看到了它們,但它並沒有真正解決我的問題。C#窗體窗體,運行兩種形式

我正在寫一個具有兩種形式的應用程序,它有一個mainForm和Password表單。

該表格用於掃描兩個代碼並匹配,如果它們相等。您掃描第一個代碼,然後掃描第二個代碼。如果它們匹配,則彈出綠燈以表明它們匹配。如果代碼不匹配,它會同時彈出紅燈和密碼錶單,並將表單文本框鎖定爲ReadOnly,以供管理員驗證用戶掃描的內容。

它正在做這一切。

問題是我想當主管輸入密碼它必須再次顯示窗體,以便用戶可以繼續掃描,這是這樣做的。但事情是,當它打開一個新的形式,後面的那個被鎖定的形式不會消失。我試圖重置表單,它不起作用。請幫忙。

//object references of the Main Form 
MainForm fm=new MainForm(); 

if ((txtPassword.Text =="This" 
{ 

    fm.BringToFront(); 

    //Reset the form to a normal state 
    fm.lblResult.Visible = false; 
    fm.txtResult.Visible = false; 
    fm.chkMtn.Checked = false; 
    fm.chkVodacom.Checked = false; 

    //Clear the textBox of the form 
    fm.txtMainFormScan1.Text=""; 
    fm.txtMainFormScan2.Text=""; 

    set the focus on the fist Scan 
    fm.txtFirstScan.Focus(); 
} 

The code above does not work. now i am using the one below. 

if ((txtPassword.Text =="ThisPassword") 
{ 
    lblInstructPassword.Text = "Password correct"; 
    txtPassword.Text = ""; 
    fm.ControlBox = true; 
    //fm.Activate(); 
    this.Hide(); //This Close the Password form 
    fm.Show(); 
    fm.chkMtn.Checked = true; 
} 

即使當我使用//fm.ShowDialog時,我也贏不了。我也嘗試使用互斥體來只允許運行一個應用程序的一個實例。結果是零。感謝您的幫助提前。

+0

你不能只寫一個方法「ResetForm()」在主表單,並從密碼錶單中調用它? – Aboc

+0

如果這個應用程序將會非常大,請考慮使用帶有MVVM模式的WPF而不是winforms。它提供了更多的力量和靈活性。 –

+0

不會很大,它的主要功能是隻解決一個問題,匹配以最小化用戶在手動掃描時執行的錯誤。 –

回答

0

你正在做很多.Net應該爲你做的工作。

在其他條件可變的細節,你真正的問題是這樣的:

  • 你有一個比較兩個值的工作形式。
  • 如果比較結果爲false,則需要模態窗口才會顯示提示輸入密碼。
  • 如果密碼正確,則需要第一個表單再次可編輯,密碼錶單消失。

你在正確的路徑上使用ShowDialog(),因爲這會禁用觸發命令顯示對話框的窗口。您需要將密碼邏輯作爲對話框表單的一部分,而不是父表單。這將允許你返回一個DialogResultenum價值的父母形式(如果有任何價值的話),讓你圍繞不必要的折騰。

如果你想調用的形式消失,當你做到這一點再次出現,包裹調用表單的ShowDialog()呼叫this.Hide()this.Show()

+0

是的,但是當第一個表單顯示時,通過使用this.showDialog()的密碼形式隱藏。但是當我關閉剛纔顯示的第一個窗體時。如果出現錯誤,我會看到該表單有錯誤。 –

+0

第二種形式是否允許更正條目? – CDove

+0

是的,第二種形式完成一切。 –