2016-04-18 23 views
2

So habe ich eine DataGridView, die ich als "Zeilenselektor" auf einem Formular verwenden, und eine Reihe von Steuerelementen sind an die bindingSource gebunden.ComboBox.SelectedValue funktioniert nicht wie erwartet

Eines der gebundenen Steuerelemente ist eine ComboBox, die als Nachschlagefunktion dient und die Statusauswahl für die Zeilen ermöglicht, die von einer DataTable mit Daten aus der DB aufgefüllt wird.

Die Bevölkerung dieser Box ist ohne jedes Problem.

Wenn eine bestimmte Zeile aus dem DGV ausgewählt wird, zeigen die Formularsteuerelemente Daten aus der angegebenen Zeile so an, wie sie sollten, aber die "statusComboBox" spielt das Spiel nicht ganz.

Wenn ich in der DGV, eine Zeile, die einen anderen Status als eine zuvor ausgewählt hat, funktioniert es wie es sollte, wenn ich eine Zeile mit dem gleichen Wert für eine zuvor ausgewählte Zeile anstelle der Box auswählen zeigt das DisplayMember das ValueMember an.

Es scheint nur in dem obigen Szenario auftreten, wo die Zeilenauswahl nur eine Display-Antwort von der gebundenen ComboBox anstiftet, die eine vorherige Auswahl hatte eine andere "Status ID". Was habe ich nicht falsch, dass würde dieses Verhalten verursachen?

So sieht die Form Last wie diese

private void ProjectsForm_Load(object sender, EventArgs e) 
{ 
    InitBindingSource(); 

    //// bind Selector 
    //ASMod$ this needs to be 'true' unless you explicitly declare columns 
    ProjectsDataGridView.AutoGenerateColumns = false; 
    ProjectsDataGridView.DataSource = ProjectsBindingSource; 

    GetData(); 

    //Set GeneralStatusBox 
    Helpers.GeneralStatusInitLookup(statusComboBox, ProjectsBindingSource); 
} 

Die ProjectBindingSource wird so initialisiert:

private void InitBindingSource() 
{ 
    ProjectsBindingSource = new BindingSource(); 
    projectsBindingNavigator.BindingSource = ProjectsBindingSource; 
    ProjectsBindingSource.PositionChanged += new EventHandler(ProjectsBindingSource_PositionChanged); 
} 

A ProjectsAddDataBindings Verfahren und die DataBindings.Add für die ComboBox enthalten (am Ende ausgeführt von eine GetData-Routine, die zusätzlich ProjectsBindingSource() befüllt:

ProjectsAddDataBindings(); 
{ 
    … 
    this.statusComboBox.DataBindings.Add("Text", ProjectsBindingSource, "GSID"); 
    … 
} 

Nach dem GetData Block der GeneralStatusInitLookup die Lookup-Elemente auffüllt, in einer Hilfsklasse, nur weil es Funktionalität zu einer Reihe von verschiedenen Formen

public static void GeneralStatusInitLookup(System.Windows.Forms.ComboBox comboBox, BindingSource primaryBindingSource) 
{ 
    string statusFilter = ""; 
    statusFilter = Helpers.GetStatusGroupFilter(EndeavourForm.FilterId); 
    if (statusFilter != "") 
    { 
     statusFilter = " WHERE " + statusFilter; 
    } 
    //// string statusFilter = ""; //// temp 

    string sql = ""; 
    sql = "SELECT GSID, ShortName FROM GeneralStatus" + statusFilter + " ORDER BY Pos"; 
    GeneralStatusDataTable = Helpers.Db.GetDataTable(sql); 

    comboBox.DataSource = GeneralStatusDataTable; 
    comboBox.DisplayMember = "ShortName"; 
    comboBox.ValueMember = "GSID"; 

    comboBox.DataBindings.Add(new Binding("SelectedValue", primaryBindingSource.DataSource, "GSID")); 
} 

Und die DGV Veränderung wie diese

private void ProjectsBindingSource_PositionChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     // Update the database with the user's changes. 
     UpdateProjects(); 
     statusComboBox.SelectedValue = (int)CurrentDataRowView.Row["GSID"]; 
    } 
    catch (Exception) 
    { 
    } 
} 

private void UpdateProjects() 
{ 
    try 
    { 
     ProjectsDataAdapter.Update((DataTable)ProjectsBindingSource.DataSource); 

     DataHelper.CommitProposedChanges(projectsDataSet); 
     if (this.projectsDataSet.HasChanges() == true) 
     { 
      ProjectsBindingSource.EndEdit(); 
      ProjectsDataAdapter.Update(); 
     } 

     CurrentDataRowView = (DataRowView)ProjectsBindingSource.Current; 
    } 
    catch (InvalidOperationException) 
    { 
     throw; 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 
behandelt wird eingeleitet Reihe bietet

Wie auch immer, ich hoffe, ich habe die Leser nicht mit zu viel Code überschwemmt, aber offen gesagt kann ich nicht sehen, wo das falsch läuft. So würde jede Hilfe sehr geschätzt werden.

Antwort

0

Dies war am Ende eine einfache Lösung. Sowohl die GeneralStatusInitLookup() - als auch die ProjectsAddDataBindings() - Blöcke verwendeten DataBindings.Add ... Für die Lookup-Tabelle war das in Ordnung, aber mit der Bindung an die Haupttabelle; Je später, hatte ich "Text" als propertyName Parameter verwendet.