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.