2017-11-13 2 views
0

Ich erstelle ein Textfeld und Schaltfläche dynamisch wie dies in einem Flowlayoutpanel:Pass Variable in dynamisch erstellte Schaltfläche Click-Ereignishandler

 Dim txtRating As New TextBox 
     txtRating.Name = "buildingRating_" + intCount.ToString 

     Dim btnAddRating As New Button 
     btnAddRating.Name = "addRating_" + intCount.ToString 

Und dann erstelle ich einen Event-Handler für die Schaltfläche:

AddHandler btnAddRating.Click, AddressOf HandleAddRatingButtonClick 

Jedes Textfeld und jede Schaltfläche werden mit dem intCount-Wert verknüpft, sodass es wie folgt aussieht:

buildingRating_1 addRating_1 
buildingRating_2 addRating_2 
buildingRating_3 addRating_3 
etc.... 

Ich muss den Wert der Textbox abrufen, die der Schaltfläche zugeordnet ist.

Zum Beispiel, wenn der Benutzer die Schaltfläche addRating_1 namens klickt, wird der Textwert von buildingRating_1 einer Datenbank gespeichert werden ...

Gibt es eine Möglichkeit, dass die Assoziation zu erhalten oder intCount in das btnAddRating.Click Ereignis passieren das ich erschaffe?

Danke!

+2

NET Benutzerereignisse festgelegt sind, so dass Sie alles, um es passieren kann nicht. Sie können das zugehörige Textsteuerelement entweder finden, indem Sie a) in die angrenzende Spalte schauen, b) den Absendernamen analysieren, um den Textsteuerungsnamen zu erstellen (außer 'addRating_4' c) ein Benutzersteuerelement erstellen, das beides enthält und * einkapselt * die duale Natur c) Erstellen Sie eine Lookup-Liste, um einmal von der anderen zu bekommen – Plutonix

+1

Warum nicht ein Lambda für den Handler verwenden? –

+0

@djv Tippfehler (fest) – SkyeBoniwell

Antwort

2

Extrahieren Sie den Index aus dem Namen der Schaltfläche und verwenden Sie ihn, um den Namen der Textbox neu zu erstellen. Dann finden Sie die Textbox auf dem Formular.

Private Sub HandleAddRatingButtonClick(sender As Object, e As EventArgs) 
    Dim button = DirectCast(sender, Button) 
    Dim index = button.Name.Split("_"c).Last() 
    Dim textboxname = "buildingRating_" & index 
    Dim textbox = Me.Controls.OfType(Of TextBox).Single(Function(tb) tb.Name = textboxname) 
    Dim text = textbox.Text ' this is the text 
End Sub 

Wenn die Textbox in einem Behälter (Panel, groupbox, etc.) dann statt Me.Controls... tun Container.Controls...

Verwandte Themen