6

テーブルを含むにDataGrid theDataGridバインドされた WPFがあります。DataSet dsユーザーが最初にグリッドで行を選択してからボタンを押すことで、ユーザーが行を削除できるようにしたいと考えています(データグリッドの外側に配置されています)。私は最終的に、私が望むことを行う次のコード行にたどり着きましたが、かなり醜いと思います。

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

これを行うより良い方法はありますか?たとえば、ループを 1 つだけ必要とし、NewItemPlaceHolder明示的にチェックする必要がないもの、または削除する行にアクセスするためのより効率的な方法はありますか?

theDataGrid.SelectedItems.Count(ループが実行されるたびに変更されるため、最初のループで ds から何も削除してはならないことが既にわかりました...)

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

1つのループだけで機能すると思います:

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 に答える