2010-11-09 76 views
0

我有一個WinForm,用作只有OKCancel按鈕的對話框。所以:返回到第一個對話框

Dim sr As New SlideRangeDialog 
Dim dr As Windows.Forms.DialogResult 
dr = sr.ShowDialog 

我有一個如果/然後看看用戶是否按下確定。如果他們按下「確定」並出現驗證錯誤,我需要他們回到對話框並修復它。

If dr = Windows.Forms.DialogResult.OK Then 
     Dim mr As Windows.Forms.DialogResult 
     mr = MsgBox("Click Yes to fix, No to not fix or Cancel to go " + vbCrLf + _ 
        " back to the dialog to fix.", MsgBoxStyle.YesNoCancel) 
       Select Case mr 
        Case Windows.Forms.DialogResult.Yes 
         ''# something 
        Case Windows.Forms.DialogResult.No 
         ''# something more 
        Case Windows.Forms.DialogResult.Cancel 
         ''# RIGHT HERE is where I'm having the problem. 
         ''# I just want "Cancel" to return to the first dialog. 
         sr.DialogResult = Windows.Forms.DialogResult.None 
       End Select 
    Else 
     ''#other thing 
    End If 

我會把在Case Windows.Forms.DialogResult.Cancel什麼帶我馬上回第一個對話框爲sr.DialogResult = Windows.Forms.DialogResult.None似乎並不奏效?

我試着再次提高事件子(這是一個菜單項的點擊),但這不適用於我使用的技術(VSTO功能區)。

+0

你試過一個While循環嗎? – 2010-11-09 22:44:49

回答

1

嘗試移動您的驗證邏輯要麼到對話框本身,或爲見here關閉對話框的事件處理程序。後者可能更容易。我的VB.NET技能是幾乎不存在所以請原諒我,如果這是沒譜:

Dim sr As New SlideRangeDialog 
Dim dr As Windows.Forms.DialogResult 
AddHandler dr.Closing, AddressOf SlideRangeDialog_Closing 
dr = sr.ShowDialog 

再後來:

Public Sub SlideRangeDialog_Closing(Sender As Object, e As CancelEventArgs) 
    ' cast Sender as a SlideRangeDialog and check its 
    ' DialogResult property to see if they clicked OK. 

    ' Your validation goes in here. 
    ' If anything fails validation, set e.Cancel to True and the 
    ' dialog won't close. 
End Sub 
+0

這是好的,讓我與此合作,看看我能否得到它的工作。 – 2010-11-09 23:02:20

+0

非常棒!謝謝! – 2010-11-09 23:31:42

+0

@Otaku我有沒有得到VB語法的權利?我不得不去谷歌!嘿。 – 2010-11-10 00:16:49

1

我認爲你需要處理ok(或者是NO等),並在表單本身中取消,如果驗證失敗,請不要關閉它。

在用作對話框的窗體上,您需要處理按鈕中的單擊事件。然後在事件處理程序中運行測試以確定是否應該關閉表單。如果是的話那麼你可以的DialogResult設置爲任何你需要和運行Me.Close()

爲例

Private Sub OKCmd_Click(_ 
    ByVal sender As System.Object, _ 
    ByVal e As System.EventArgs) Handles OKCmd.Click 

    If Not ____do_your_test_here____ Then 
     MsgBox("Cannot press OK because of blah blah blah . Try again.", MsgBoxStyle.Exclamation) 
    Else 
     Me.DialogResult = DialogResult.OK 
     Me.Close() 
    End If 
End Sub 
+0

不知道這甚至意味着什麼... – 2010-11-09 22:46:18

0

自VSTO和您有問題,用「正常」裝置,以屏幕之間的溝通,你爲什麼不嘗試使用的PInvoke來代替: 鑑於你知道如何獲得受窗口的hwnds使用此代碼:

[DllImport("user32.dll")] 
    public static extern bool SetFocus(IntPtr hwnd); 
0

由於普里特建議是恕我直言莫st直接處理按鈕事件中的'Me.Close'聲明。

您也可以通過從按鈕事件處理程序中刪除它並稍後關閉邏輯樹中的表單來完成此操作。在我的例子中,我有兩種形式。 Form1有一個打開Form2的按鈕,並且有一個按鈕帶有OK和Cancel按鈕。因此,第二個表上,你可以使用以下命令:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Me.DialogResult = Windows.Forms.DialogResult.OK 
End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Me.DialogResult = Windows.Forms.DialogResult.Cancel 
    Me.Dispose() 
End Sub 

你應該記住,使用ShowDialog的形式時,從未設置的,除非您特別要求它。一個簡單的Yes/No示例來詢問用戶是否想要確認關閉。

If Form2.ShowDialog = Windows.Forms.DialogResult.OK Then 
     Select Case MessageBox.Show("Sure to close?", "Warning", MessageBoxButtons.YesNo) 
      Case Windows.Forms.DialogResult.Yes 
       Form2.Dispose() 
      Case Windows.Forms.DialogResult.No 
       Button2_Click(sender, e) 
     End Select 
    End If 

的Button2_Click子被遞歸調用,以保持只要行被選擇在第二形式顯示和NO在下面的消息框。我希望這有幫助。

相關問題