2011-07-30 91 views
2

如何選擇datagrid中的行索引?選擇datagrid中的行索引(wpf)

事件的SelectionChanged

下面的代碼不起作用:

 private DataGridRow dgr = new DataGridRow(); 

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

     this.dgr = this.dataGrid.ItemContainerGenerator.ContainerFromItem(this.dataGrid.SelectedItem) as DataGridRow; 
     MessageBox.Show(this.dgr.GetIndex().ToString()); 

    } 

回答

3

之所以上面的代碼是行不通的,因爲WPF數據網格是虛擬化的,它可能不會返回使用itemContainerGenerator.ContainerFromItem行,因爲它可能位於滾動視圖之外。

爲此,您將不得不使用所選項目使用datagrid的項目集合和IndexOf調用。

private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var dg = sender as DataGrid; 
     MessageBox.Show(dg.Items.IndexOf(dg.SelectedItem).ToString()); 
    } 
+0

錯誤:未將對象引用設置爲對象的實例。 – mrJack

+0

如果dg爲null,那麼請改用this.dataGrid。如果dg.SeletedItem爲null,那麼進行檢查,如果不是null,則返回索引。 –

+0

正確答案:var dg = dataGrid.CurrentItem作爲DataRowView; MessageBox.Show(dg [0] .ToString()); – mrJack

2

我的回答很晚,但我希望它仍然會對搜索引擎發現此帖子的人有用。這是更通用的解決方案,它也有助於定義所有選定行的索引。

List<int> RowIndexes = new List<int>(); 
int SelectedItemsCount = yourDataGrid.SelectedItems.Count; 
    for (int i = 0; i < SelectedItemsCount ; i++) 
      { 
       RowIndexes.Add(yourDataGrid.Items.IndexOf(yourDataGrid.SelectedItems[i])); 
      } 

現在RowIndexes包含所選行的所有索引。只需將代碼放入您希望的事件中,就是這樣。

1

這是一個遲到的答案,但這是我的成就。這使您可以選擇每行的指數在DataGrid(dgQuery是我的DataGrid的名稱):

foreach (var selection in dgQuery.SelectedItems) 
{ 
     DataRowView row = (DataRowView)item; 

     int index = Convert.ToInt32(row.Row[0]) - 1; 
} 

它在索引0給出了1,所以我們需要每一個指數減去1。

.Row[0]實際上是一個列(在我的腦海中)... DataRowView,不知道爲什麼它被稱爲一行。您可以將其更改爲[1],[2]等以查看該行內的其他單元格。

有了這個解決方案,你不需要一個集合,數組,沒有那種類型。您只需使用現有的代碼即可使用。

這個實現的巨大優勢至少對我來說是一個事實,它按照它們被選擇的順序遍歷選定的項目。如果你想知道用戶選擇的順序,這可能是一個非常強大的工具。

我發佈這個,因爲我只花了4個多小時尋找解決方案。我甚至放棄了複選框,因爲我沒有足夠的時間來實施這些工作,可能會在路上。