2016-03-27 16 views
2

Hala VB'yi yaşıyorum ve iyi bir öğretici olmadan bir problem yaşadım. Bir döngünün her döngüsünde bir Textbox ve Update butonu oluşturan dinamik bir form oluşturdum.Dinamik Bir Biçimde, bir metin kutusunun (tbRef) içeriğini ile birlikte oluşturulan düğmeye nasıl bağlarım?

ben ilan ettiler aşağıdaki küresel değişkenler: döngü içinde

Dim tbRef As Textbox 
WithEvents btnUpdate As Button 

ve üstü

Do Until counter = Maxrows 

counter = counter + 1 
... 
tbRef = New TextBox 
... 
Me.Controls.Add(tbRef) 


btnUpdate = New button 
... 
AddHandler btnUpdate.Click, AddressOf btnUpdate_Click 
Me.Controls.Add(btnUpdate) 
... 
tbRef.Text = ds.Tables("Records").Rows(counter - 1).Item(0) 

Loop 

Ve Nihayet

Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click 
UpdateForm.tbRef.Text = Me.tbRef.Text 
UpdateForm.Show() 
End Sub 

aşağıdaki Benim Sorun:

Kod doğru düzeni ve doğru denetimleri üretir ve yalnızca bir sonuç döndürülürse düğme düzgün çalışır. Birden fazla düğme oluşturulmuşsa, tüm düğmeler oluşturulan son Metin Kutusu'nun içeriğine başvurur. İnternette bulduğum tek cevap, Ctype/DirectCast'i her metin kutusunun içeriğini, onunla oluşturulan düğmeye dönüştürmek için kullanmam gerektiğiydi, ancak bu bağlamda bu Operatörlerin nasıl kullanılacağına dair herhangi bir eğitim bulamıyorum. Herhangi bir yardım büyük takdir edilecektir.

+2

Kişisel tbRef değişkeni yalnızca * Bir * metin takip edebilirsiniz. Ama birden fazla yaratıyorsun. Yani bu işe yaramaz, bunun yerine bir liste (TextBox) olarak bildirmeniz gerekir. Ve Tıkla etkinlik işleyicinizde hangi özel düğmenin tıklandığını bilmeniz gerekir; böylece doğru metin kutusunu tekrar listede bulabilirsiniz. Düğmenin Adı veya Etiketi özelliği ile bunu yapabilirsiniz. Bunun yerine bir UserControl oluşturursanız, tüm bunlar çok daha kolay olabilir. –

cevap

3

Bir seçenek olarak, Tag düğmesinin özelliğini kullanabilir ve etiket özelliğindeki metin kutusuna bir başvuru depolayabilirsiniz. Ardından düğmenin sorumlu olduğu metin kutusunu bulmak istediğinizde, DirectCast tuşunu kullanarak metin kutusunun etiket özelliğindeki metin kutusunu kaldırabilirsiniz. Düğmenin kendisi, olayı işleyen yöntemin gönderici parametresindedir.

Ayrıca, metin kutularına bir ad atayabilir ve adı etiket özelliğine kaydedebilir ve ardından bu adı kullanarak denetimi bulabilirsiniz. Örneğin

For index = 1 To 10 
    Dim txt = New TextBox() 
    'Set other properties 
    'Add it to form 

    Dim btn = New Button() 
    btn.Tag = txt 
    AddHandler btn.Click, New EventHandler(AddressOf btn_Click) 
    'Set other properties 
    'Add it to form 
Next 

için

Eğer olay bu şekilde işleyebilir:

Private Sub btn_Click(sender As Object, e As EventArgs) 
    Dim btn = DirectCast(sender, Button) 
    Dim txt = DirectCast(btn.Tag, TextBox) 
    MessageBox.Show(txt.Text) 
End Sub 
+0

İyi cevap. Bunu veya "Ebeveyn" özelliğini önerecektim ama çok hızlısın. –

+0

@VisualVincent Teşekkürler :) Kesinlikle, Hans tarafından önerilen gibi UserControl oluşturmak için akla gelebilecek bazı iyi seçenekler vardır. –

+0

Bu arada, tüm kontroller tek bir formda bulunur ve aynı ebeveyn formuna sahiptir. –

İlgili konular