2016-12-14 59 views
0

我正在開發一個winforms應用程序。我有兩個datagrid視圖從兩個不同的綁定資源(控制)填充。我正在使用這些來實現主細節方法。我的問題是,當使用綁定源填充第一個datagridview時,我無法選擇它的第一行,因爲綁定源中的第一個元素是默認選擇的,無法選擇。任何人都可以爲我提供解決方案C#綁定源控件

+0

我不明白你的問題。你想選擇第一行,但問題是它被選中?澄清你的問題。 – Sebi

+0

我想填充從第一個datagridview作出的選擇第二個datagridview。因此,當第一個datagridview從綁定源代碼控件填充時,我無法選擇該datagridview中的第一行(如果我選擇第二行它正在工作,我可以在選擇任何其他行後選擇最後一行) –

回答

1

正如你所說,第一行是默認選中的。因此,在將DataSource填充到第一個GridView後,可以基於第一個條目設置第二個GridView。稍後,您會檢查selectionChanged事件以基於第一個GridView的selectedRow填充第二個GridView。

代碼可能看起來像。像這樣:

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 
} 

如果這不起作用,讓我知道,但應該做的工作。

UDPATE

下面是一個使用事件和BindingSource的方法類似的例子:

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; 
} 

而且你也許可以使用:

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

爲了模擬重點Seconde系列排並直接排在第一排。有點醜,但我猜想這會觸發current_changed(未經測試)。更好地使用第一種方法

UDPATE-2

我很遺憾地告訴你,這是不可能在一個美麗的方式。問題是,如果您的DataSource包含項目,那麼您的bindingList的Current屬性總是被設置。所以如果用戶選擇與bindingSource相同的行當前屬性包含你的事件不會被調用。我找到了一個適用於我的例子的解決方案。你需要一個gridEvent,也許必須做一些改進,但這個想法應該能夠完成這項工作。對不起,但沒有gridEvent我不能解決這個問題:

請注意,iam使用列表作爲我的測試用例的數據源。你有DataTable,並且必須強制轉換爲DataRowView而不是Dummy。

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

非常感謝。但是我的問題有點不同。我早些時候嘗試過上述解決方案,但沒有奏效。問題(在我的上下文中)是綁定源,如果我檢查dataGridView1.SelectedRows.Count它顯示0.這是因爲當我們使用綁定源綁定datagridview時,綁定源中的第一個元素是當前項(in綁定源)。所以加載第一個數據gridview後,我不能通過選擇第一個項目來調用綁定源的current_changed事件處理程序。在這種形式下,我想利用綁定源事件。 –

+0

@VipinJacob我更新了我的答案,以實現使用bindingSource事件和方法的行爲。 – Sebi

+0

它的工作原理,但我不想加載第二個datagridveiw最初。我只想加載第一個datagridview,然後用戶必須決定在第一個datagridveiw上進行選擇。根據該選擇,需要加載第二個datagridview。我想要使​​用綁定源事件。 –