2016-08-08 75 views
0

Ich habe eine WinForms App mit einem Explorer-Stil TreeView auf der linken Seite. Durch Auswählen verschiedener Knoten werden verschiedene Benutzersteuerelemente angezeigt, die aus verschiedenen anderen Standardsteuerelementen bestehen. Alle Steuerelemente innerhalb der verschiedenen Benutzersteuerelemente sind an ein einzelnes DataSet gebunden. Ich habe eine ComboBox oberhalb des Bereichs der Struktur (um zwischen Test- und Live-Einstellungen zu wechseln) gebunden eine Master-Tabelle, und wie ich Master-Detail-Beziehungen Setup zwischen den Tabellen, ändert das Ändern der ComboBox die aktuelle Zeile für alle untergeordneten Tabellen. So weit, ist es gut.WinForms programmatische Bindung von Master-Detail

Ich habe jetzt Plugable Sub-Trees hinzugefügt (von separaten DLLs abgeholt), und jeder Unterbaum verwendet seine eigenen DataSet. Der Teil, mit dem ich Probleme habe, ist, wie man die Unterbäume mit der Master-Tabelle verbindet. Ich habe die Master-Tabelle innerhalb der DataSets der Unterbäume repliziert (weil die Beziehungen zwischen den DataSets nicht funktionieren), aber weil die Unterbäume keine eigene ComboBox haben, bin ich nicht sicher, wie die Bindung funktioniert . Ich denke, ich brauche einen CurrencyManager für jede Unterstruktur und verbinde sie irgendwie mit dem Änderungsereignis der ComboBox, aber wie verweise ich die UserControls der Unterstruktur auf den CurrencyManager?

Antwort

0

Das Stück, das ich fehlte, war ein Binding für den Unterbaum ... und

bindingContext = new BindingContext(); 

... und wenn er dann auf den Unterbaum des Usercontrols:

public partial class MyUserControl : UserControl 
{ 
    public MyUserControl(BindingContext bindingContext, DataSet dataSet) 
    { 
     this.BindingContext = bindingContext; 
     InitializeComponent(); 
     myTextBox.DataBindings.Add("Text", dataSet, "Master.Master_Detail.DetailField"); 
    } 
} 

I Ich habe nicht verstanden, dass der CurrencyManager nicht explizit für die Verknüpfung mit dem DataSet erstellt werden muss. Das Einstellen der DataBindings ist ausreichend.

die zwei separate Datasets in Schritt halten dann erforderlich nur eine Methode wie folgt:

public void MasterChanged(long masterID) 
{ 
    var currencyManager = bindingContext[dataModel.DataSet, "Master"]; 
    var masterRows = masterTable.Rows; 
    for (int position = 0; position < masterRows.Count; position++) 
    { 
     if (((long)masterRows[position]["ID"]) == masterID) 
     { 
      currencyManager.Position = position; 
      break; 
     } 
    } 
}