2012-12-25 22 views
6

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

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

+0

私には解決策がありますか? – gasroot

答えて

0

私はそれだけで一つのループでうまくいくと思う(私はすでに、その後theDataGrid.SelectedItems.Count変化毎回ループが実行されたが...以来、私は、最初のループでは、DSから何かを削除してはならないことを考え出し):

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

ありがとうございます。 「編集」の後に追加したforeachループは、私の最初の「解決策」でした。処理されない例外が発生します。これは、私の質問の最後の行で言及していたもので、括弧内のものです。 SelectedItemsコレクションはループ中に変更され、foreachカウンタは無効なものを参照します(私は思う)。私は最初のアプローチでも同じことを期待しています。 – Thomas

+0

@Thomasあなたは2番目のことについては正しいですが、少なくとも私は最初にコレクションの変更例外がスローされないと確信しています。 – Ramin

+0

最終的に(現在の)SelectedItems.Countよりも大きくなるインデックスを増やすため、クラッシュします。 SelectedIndex [0]を毎回検索すると、おそらく動作します。しかし、正直言って、手動で更新されたカウンターでは、自分のコードよりも良いわけではありません。私が望むのは、2番目の提案のような1つのライナーですが、クラッシュしない1つのライナーです;-) – Thomas

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

を:

private void ButtonClickHandler(object sender, RoutedEventArgs e)//Remove row selected 
    { 
     DataRowView dataRow = (DataRowView)dataGridCodes.SelectedItem; //dataRow holds the selection 
     dataRow.Delete();      
    } 
関連する問題