6

我有一个DataGrid theDataGrid绑定到DataSet ds包含表的 WPF。我想让用户通过首先在网格中选择它们然后按下一个按钮(位于数据网格之外的某个位置)来删除线。我终于到达了以下代码行,它们可以满足我的需求,但我认为它们相当丑陋:

  DataSet ds = new DataSet();
        ...
  // fill ds somehow
        ...
  private void ButtonClickHandler(object Sender, RoutedEventArgs e) 
  {
        List<DataRow> theRows = new List<DataRow>();
        for (int i = 0; i < theDataGrid.SelectedItems.Count; ++i)
        {
            // o is only introduced to be able to inspect it during debugging
            Object o = theDataGrid.SelectedItems[i];
            if (o != CollectionView.NewItemPlaceholder)
            {
                DataRowView r = (DataRowView)o;
                theRows.Add(r.Row);
            }
        }
        foreach(DataRow r in theRows) 
        {                
            int k = ds.Tables["producer"].Rows.IndexOf(r);
            // don't remove() but delete() cause of update later on
            ds.Tables[0].Rows[k].Delete();
        }
   }

有一个更好的方法吗?例如,只需要一个循环而无需NewItemPlaceHolder显式检查,或者可能是一种更有效的方式来访问要删除的行?

(我已经发现我不能在第一个循环中从 ds 中删除任何内容,因为theDataGrid.SelectedItems.Count每次执行循环时都会更改......)

4

3 回答 3

1

为了删除在按钮单击时选择的行,您可以尝试:

private void ButtonClickHandler(object sender, RoutedEventArgs e)//Remove row selected
     {
      DataRowView dataRow = (DataRowView)dataGridCodes.SelectedItem; //dataRow holds the selection
      dataRow.Delete();                    
     }
于 2014-09-01T11:52:36.363 回答
0

您可以通过向后迭代来删除双循环:

private void ButtonClickHandler(object Sender, RoutedEventArgs e) {
    for (int i = theDataGrid.SelectedItems.Count-1; i>=0; --i)
        if (theDataGrid.SelectedItems[i] != CollectionView.NewItemPlaceholder)
            ds.Tables[0].Rows[i].Delete();
   }
于 2014-04-09T17:24:41.797 回答
0

我认为它只通过一个循环起作用:

int count=theDataGrid.SelectedItems.Count;
int removedCount=0; 
while (removedCount < count)
{
    try{
         Object o = theDataGrid.SelectedItems[0];
    }
    catch{ break;}

    if (o == CollectionView.NewItemPlaceholder)
    continue;

    DataRowView r = (DataRowView)o;
    r.Row.Delete();
    removedCount++;
}
于 2012-12-25T15:24:04.143 回答