2016-12-14 8 views
0

Ich entwickle eine Winforms-Anwendung. Ich habe zwei Datagrid-Ansichten, die aus zwei verschiedenen Bindingsources (Steuerung) bevölkert sind. Ich verwende diese, um den Hauptdetailansatz zu implementieren. Mein Problem ist, dass wenn die erste Datagridview mit der Bindungsquelle gefüllt wird, ich die erste Zeile davon nicht auswählen kann, weil das erste Element in der Bindungsquelle standardmäßig ausgewählt ist und nicht ausgewählt werden kann. Kann mir jemand eine Lösung dafür gebenC# Binding Source Control

+0

Ich verstehe dein Problem nicht. Sie möchten die erste Zeile auswählen, aber das Problem ist, dass es ausgewählt ist? Stellen Sie klar, was Ihr Problem ist. – Sebi

+0

Ich möchte die zweite Datagridview aus der Auswahl der ersten Datagridview ausfüllen. Wenn also die erste datagridview von einer verbindlichen Quellensteuerung aufgefüllt wird, kann ich die erste Zeile in dieser datagridview nicht auswählen (Wenn ich die zweite Zeile wähle, die funktioniert, könnte ich nach der Auswahl anderer Zeilen die erste Zeile auswählen) –

Antwort

1

Wie Sie sagen, ist die erste Zeile standardmäßig ausgewählt. Nachdem Sie die DataSource in Ihre erste GridView-Datei eingefügt haben, können Sie die zweite GridView-Datei basierend auf dem ersten Eintrag festlegen. Später überprüfen Sie das selectionChanged Event, um die zweite GridView basierend auf selectedRow des ersten zu füllen.

Code könnte etw. wie folgt:

private void PopulateDataSource() 
{ 
    dataGridView1.DataSource = myBindingSource; 

    DataRowView selectedRow; 
    if (dataGridView1.SelectedRows.Count > 0) 
     selectedRow = dataGridView1.SelectedRows[0] as DataRowView; 

    if (selectedRow != null) 
     dataGridView2.DataSource = myBindingSource2; //Set the BindingSource based on selectedRow in first Grid 

} 

private void dataGridView1_SelectionChanged(object sender, EventArgs e) 
{ 
    DataRowView selectedRow; 
    if (dataGridView1.SelectedRows.Count > 0) 
     selectedRow = dataGridView1.SelectedRows[0] as DataRowView; 

    if (selectedRow != null) 
     dataGridView2.DataSource = myBindingSource2; //Set the BindingSource based on selectedRow in first Grid 
} 

Wenn das nicht funktioniert, lass es mich wissen, aber sollte den Job machen.

UDPATE

Hier ist ein ähnliches Beispiel die Ereignisse und Methoden des Binding mit:

private void Initialize() 
{ 
    RegisterBindingSourceEvents(); 
    dataGridView1.DataSource = bindingSource1; 
    dataGridView2.DataSource = bindingSource2; 
    bindingSource1.DataSource = myDataSource; 
} 

private void RegisterBindingSourceEvents() 
{ 
    bindingSource1.DataSourceChanged += BindingSource1_DataSourceChanged; 
    bindingSource1.CurrentChanged += BindingSource1_CurrentChanged; 
} 

private void BindingSource1_CurrentChanged(object sender, EventArgs e) 
{ 
    DataRowView row = bindingSource1.Current as DataRowView; 
    if (row != null) 
     bindingSource2.DataSource = myDataSource2BasedOnRow; 
} 

private void BindingSource1_DataSourceChanged(object sender, EventArgs e) 
{ 
    DataRowView row = bindingSource1.Current as DataRowView; 
    if (row != null) 
     bindingSource2.DataSource = myDataSource2BasedOnRow; 
} 

Weitere vielleicht Sie verwenden können:

bindingSource.MoveNext(); 
bindingSource.MoveFirst(); 

Zur Fokussierung seconde Reihe zu simulieren und direkt in der ersten Reihe. Ein bisschen hässlich, aber ich würde raten, dass dies current_changed (ungeprüft) ausgelöst wird. Bessere Verwendung des ersten Ansatzes.

UDPATE-2

Es tut mir leid, Ihnen zu sagen, dass dies nicht möglich, in einer schönen Weise ist. Das Problem besteht darin, dass die aktuelle Eigenschaft Ihrer Bindungsliste immer dann gesetzt wird, wenn Ihre DataSource Elemente enthält. Wenn also der Benutzer die selbe Zeile auswählt, wie die bindingSource Current Property enthält, wird Ihr Event nicht aufgerufen. Ich habe eine Lösung gefunden, die in meinem Beispiel funktioniert. Sie werden ein GridEvent benötigen und vielleicht einige Verbesserungen vornehmen müssen, aber die Idee sollte die Aufgabe erfüllen. Sorry, aber ohne gridEvent kann ich das nicht lösen:

Beachten Sie, dass iam List als DataSource für meinen Testfall verwendet. Sie haben DataTable und müssen sicher nach DataRowView statt Dummy umwandeln.

private bool _automatedRowChange; 

     private void Initialize() 
     { 
      List<Dummy> dummies = new List<Dummy> { new Dummy { Id = 1, Text = "Test1" }, new Dummy { Id = 2, Text = "Test2" } }; 
      bindingSource1.DataSource = dummies; 
      dataGridView1.DataSource = bindingSource1; 

      //So the first row isn't focused but the bindingSource Current Property still holds the first entry 
      //That's why it won't fire currentChange even if you click the first row. Just looks better for the user i guess 
      dataGridView1.ClearSelection(); 

      bindingSource1.CurrentChanged += BindingSource1_CurrentChanged; 
      dataGridView1.CellClick += DataGridView1_CellClick; 
     } 

     private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
     { 
      var clickedRow = dataGridView1.Rows[e.RowIndex].DataBoundItem as Dummy; 
      var currentRow = bindingSource1.Current as Dummy; 

      if (clickedRow != null && 
       currentRow != null && 
       clickedRow.Equals(currentRow)) 
      { 
       _automatedRowChange = true; 
       bindingSource1.MoveNext(); 

       _automatedRowChange = false; //MovePrevious is based on the click and should load the dataSource2 
       bindingSource1.MovePrevious(); 
      } 
     } 

     private void BindingSource1_CurrentChanged(object sender, EventArgs e) 
     { 
      if (!_automatedRowChange) //Check if you jump to next item automatically so you don't load dataSource2 in this case 
      { 
       //Set the second DataSource based on selectedRow 
      } 
     } 
+0

Vielen Dank. Aber mein Problem ist ein bisschen anders. Ich habe die obige Art von Lösung früher versucht, es hat nicht funktioniert. Das Problem (in meinem Kontext) ist mit der Bindungsquelle, wenn ich dataGridView1.SelectedRows.Count überprüfe, zeigt es 0 an. Das liegt daran, wenn wir den Datagridview mit einer Bindungsquelle binden, ist das erste Element in der Bindungsquelle das aktuelle Element (in die Bindungsquelle). Nach dem Laden des ersten Daten-Gridview kann ich den current_changed Event-Handler der Bindungsquelle nicht aufrufen, indem ich das erste Element auswähle. In diesem Formular möchte ich die verbindlichen Quellenereignisse nutzen. –

+0

@VipinJacob Ich habe meine Antwort aktualisiert, um das Verhalten mithilfe der Ereignisse bindingSource und Methoden zu implementieren. – Sebi

+0

es funktioniert, aber ich möchte nicht das zweite datagridveiw zunächst laden.Ich möchte nur die erste Datagridview laden und dann muss der Benutzer über die Auswahl auf dem ersten Datagridveiw entscheiden. Und basierend auf dieser Auswahl muss der zweite Datagridview geladen werden. Und ich möchte genau die Bindungsquellenereignisse verwenden. –

Verwandte Themen