2009-05-07 10 views
1

J'ai un formulaire avec une zone de liste et quelques zones de texte, lorsque l'utilisateur sélectionne un élément de la zone de liste, j'ai besoin de l'information appropriée pour apparaître dans le boîtes de txt et permettre à l'utilisateur de l'éditer.Que manque-t-il ... windows forms binding avec subsonic

Voici mon formulaire événement Load:

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 

Et la SelectedIndexChange pour la liste:

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 

J'utilise VB.Net 2005, mais peut convertir vos suggestions de C# si nécessaire ;)

Merci Tony W

Répondre

1

Vous ne liez pas réellement la nouvelle valeur sélectionnée aux zones de texte. Tout ce que vous faites est de changer votre référence (prt) pour pointer de l'objet de liaison d'origine, à un objet différent qui vient d'être sélectionné par l'utilisateur.

Vous devez faire quelque chose comme ceci:

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

Prendre cette route ne défaites sortof la cependant, «mettez-le et oubliez-le», la mentalité du databinding. Il est préférable de lier à un objet persistant une fois plutôt que de détruire et de recréer les liaisons de données à chaque fois. –

+0

Pas vraiment, au sens où il l'utilise, la liaison de données n'est pas responsable de savoir quand l'utilisateur a l'intention de "changer" l'objet qui est lui-même databound. Le problème n'est pas la liaison de données, c'est l'intention de changer ce qui est databound. – Joseph

+0

Génial! merci Tony W –

0

Votre question est t Le fait que vous assignez prt dans votre code. Vos contrôles sont liés à la référence prt au moment où les liaisons sont créées. Lorsque vous l'affectez plus tard, les contrôles ne pointent pas dessus.

Ce que vous devez faire est d'ajouter un composant BindingSource, le fait pointer le type d'objet qui est prt, puis lier vos contrôles à la composante BindingSource. Lorsque vous avez besoin de récupérer, définissez la propriété DataSource du BindingSource comme objet récupéré.

0

Vous lierait à une propriété 'Prt':

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

ou

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