2014-02-09 35 views
0

我正在使用vb.net winforms創建一個包含用戶控件的應用程序,我也在創作用戶控件。包含表格的用戶控件控件

用戶控件activate1

含有用戶控件(以及其他內容)的形式名爲Form1

目前我試圖使Form 1上的按鈕名爲當activate1一個MaskedTextBox中完成

我試圖通過這樣做:

Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged 
    If MaskedTextBox1.Text.Count = 34 Then 
     Form1.SimpleButton1.Enabled = True 
    Else 
     Form1.SimpleButton1.Enabled = False 
    End If 
End Sub 

但是我運行的應用程序「的對時收到錯誤米建設時提到自己從默認實例,從而導致無窮遞歸」所以不是我試圖

Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged 
    If MaskedTextBox1.Text.Count = 34 Then 
     me.SimpleButton1.Enabled = True 
    Else 
     me.SimpleButton1.Enabled = False 
    End If 
End Sub 

但是這個標誌,並且不允許編譯,因爲我指的是沒有在用戶中存在一個按鈕控制

我怎樣才能做到這一點

+1

您可以在UserControl上添加一個RT屬性,它允許您傳遞表單引用,或者可以在usercontrol上嘗試.FindForm。總的來說,聽起來這樣的一些會更好地由一個班級服務。 – Plutonix

+0

我選擇了基於關於http://stackoverflow.com/questions/18191450/making-multiple-forms-appear-as-one-in-vb-net –

+0

的建議usercontrol你可以解釋findform的語法,因爲我試過Dim myform As Form = Form1.SimpleButton1.FindForm(),它似乎不起作用,其他所有設置語法標誌關閉 –

回答

1

的原因第一個錯誤是,您使用的類型名稱引用到Form1,你會需要父窗體的具體實例。您可以通過訪問ParentForm -property訪問父窗體:

Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged 
    Dim form = TryCast(ParentForm, Form1) 
    If form IsNot Nothing Then 
     If MaskedTextBox1.Text.Count = 34 Then 
      form.SimpleButton1.Enabled = True 
     Else 
      form.SimpleButton1.Enabled = False 
     End If 
    End If 
End Sub 

請注意,這種方法將你的表格和你的用戶控件緊密。雖然它可以工作,但它會降低UserControl的可重用性(實際上,您只能在Form1上使用它,而不能在其他表單上使用它)。儘管你可以改善這一點,例如通過創建一個接口,但UserControl將始終以某種方式綁定到支持此按鈕的表單。
更可重複使用的方法是在你的用戶控件引發一個事件,並在父母的形式解決這個問題,比如:

Public Class ActivationInfoEventArgs 
    Inherits EventArgs 

    Public Property Completed As Boolean 
End Class 

Public Event ActivationInfoChanged As EventHandler(Of ActivationInfoEventArgs) 

Private Sub MaskedTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MaskedTextBox1.TextChanged 
    Dim completed As Boolean 
    If MaskedTextBox1.Text.Count = 34 Then 
     completed = True 
    Else 
     completed = False 
    End If 
    RaiseEvent ActivationInfoChanged(Me, New ActivationInfoEventArgs() With { .Completed = completed }) 
End Sub 

您添加處理程序在Form1中的事件,(去)激活按鈕這個處理器。這樣,您可以在更多種類的表單上使用UserControl。

+0

提出的最高選項:在WindowsApplication19.exe中發生類型'System.NullReferenceException'的異常,但未在用戶代碼中處理 底部選項使應用程序不穩定,我不得不恢復爲舊版本以便讓設計器工作再次 –

+1

@JamesStafford:我已經更新了示例,以便它也應該在設計器中工作。很明顯,ParentForm不是在設計時設置的。 – Markus

相關問題