2009-05-07 5 views
1

Ich habe ein Formular mit einem Listenfeld und ein paar Textfelder, wenn der Benutzer ein Element aus dem Listenfeld auswählt, brauche ich die entsprechenden Informationen in der angezeigt werden txt boxes und erlauben dem Benutzer, es zu bearbeiten.Was fehlt mir ... Windows Formen Bindung mit Unterschall

Hier ist meine Form Load-Ereignis:

Private prt As New DataAccess.Part 

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     Dim lc As System.Web.UI.WebControls.ListItemCollection = DataAccess.Part.GetListItems() 
     cboParts.DataSource = lc 
     lstParts.DataSource = lc 

     txtPartBefore.DataBindings.Add(New Binding("Text", prt, "PartNumBefore", True, DataSourceUpdateMode.OnPropertyChanged)) 
     txtPartAfter.DataBindings.Add(New Binding("Text", prt, "PartNumAfter", True, DataSourceUpdateMode.OnPropertyChanged)) 
     txtOperation.DataBindings.Add(New Binding("Text", prt, "Operation", True, DataSourceUpdateMode.OnPropertyChanged)) 
     txtNotes.DataBindings.Add(New Binding("Text", prt, "Notes", True, DataSourceUpdateMode.OnPropertyChanged)) 

End Sub 

Und die SelectedIndexChange für das Listenfeld:

Private Sub lstParts_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstParts.SelectedIndexChanged 

    Dim ctl As ListControl = DirectCast(sender, ListControl) 

    prt = DataAccess.Part.FetchByID(ctl.SelectedValue.value) 

End Sub 

Ich verwende VB.Net 2005, kann aber Ihre Vorschläge von C# konvertieren, wenn nötig ;)

Dank Tony W

Antwort

1

Sie sind nicht verbindlich tatsächlich die neu gewählte Wert auf die Textfelder ein. Sie ändern lediglich Ihre Referenz (prt) so, dass sie vom ursprünglichen Bindungsobjekt auf ein anderes Objekt zeigt, das gerade vom Benutzer ausgewählt wurde.

Sie brauchen so etwas wie dies zu tun:

Private Sub lstParts_SelectedIndexChanged(
     ByVal sender As System.Object, ByVal e As System.EventArgs) 
     Handles lstParts.SelectedIndexChanged 

     Dim ctl As ListControl = DirectCast(sender, ListControl) 

     prt = DataAccess.Part.FetchByID(ctl.SelectedValue.value) 

     BindControls(prt) 
    End Sub 

    Sub BindControls(ByVal newPart as DataAccess.Part) 
     txtPartBefore.DataBindings.Clear() 
     txtPartAfter.DataBindings.Clear() 
     txtOperation.DataBindings.Clear() 
     txtNotes.DataBindings.Clear() 

     txtPartBefore.DataBindings.Add(
      New Binding("Text", newPart, "PartNumBefore", True, 
      DataSourceUpdateMode.OnPropertyChanged)) 
     txtPartAfter.DataBindings.Add(
      New Binding("Text", newPart, "PartNumAfter", True, 
      DataSourceUpdateMode.OnPropertyChanged)) 
     txtOperation.DataBindings.Add(
      New Binding("Text", newPart, "Operation", True, 
      DataSourceUpdateMode.OnPropertyChanged)) 
     txtNotes.DataBindings.Add(
      New Binding("Text", newPart, "Notes", True, 
      DataSourceUpdateMode.OnPropertyChanged)) 
    End Sub 
+1

diese Route sortof nicht besiegt die "Setzen Sie es und vergessen Sie es" Mentalität der Datenbindung, obwohl. Es ist besser, einmal an ein persistentes Objekt zu binden, anstatt die Datenbindungen jedes Mal zu zerstören und neu zu erstellen. –

+0

Nicht wirklich, im Sinne dessen, wie er es benutzt, ist das Datenbinding nicht dafür verantwortlich, zu wissen, wann der Benutzer "ändern" will, welches Objekt selbst verbunden ist. Das Problem ist nicht die Datenbindung, es ist die Absicht zu ändern, was datengebunden ist. – Joseph

+0

Super! danke Tony W –

0

Ihr Problem ist, t Die Tatsache, dass Sie prt in Ihrem Code zuweisen. Ihre Steuerelemente sind an die Referenz gebunden, die zum Zeitpunkt der Erstellung der Bindungen auf prt verweist. Wenn Sie es später zuweisen, zeigen die Steuerelemente nicht darauf.

Was Sie tun sollten, ist eine BindingSource Komponente hinzufügen, zeigen Sie auf den Objekttyp prt ist, dann binden Sie Ihre Steuerelemente an die BindingSource Komponente. Wenn Sie abrufen müssen, legen Sie die DataSource-Eigenschaft des BindingSource als Ihr abgerufenes Objekt fest.

0

Sie auf eine Eigenschaft binden würde 'Prt':

public DataAccess.Part Prt { get { return prt; } set { prt = value; } } 

oder

Public Property Prt() As DataAccess.Part 
Get 
    Return prt 
End Get 
Set(ByVal Value As DataAccess.Part) 
    prt = value 
End Set 
End Property