2016-05-31 315 views
1

私はC#、wpf、DataGrid、SqlDataAdapter、DataTable、MS SQLサーバーを使用しています メインフォームには、DataGridとボタンがあります。 ボタンをクリックすることは、DataGridの選択された行から削除する必要があります。そしてデータベースから。しかし、これは起こっていない! DataGridからのみ!ここ は私のコードです:c#wpf - DataGrid選択した行を削除します。

private void Button_DeleteSelectedRows_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      if (dataGrid.SelectedItems.Count == 1) 
      { 
       int selectedIndex = dataGrid.SelectedIndex; 
       var row = dataTable.Rows[selectedIndex]; 
       row.Delete(); 

       dataAdapter.Update(dataTable); 
      } 
      else if (dataGrid.SelectedItems.Count > 1) 
      { 
       int count = dataGrid.SelectedItems.Count; 

       for (int i = count - 1; i >= 0; i--) 
       { 
        DataRowView rowView = dataGrid.SelectedItems[i] as DataRowView; 

        dataTable.AsEnumerable() 
           .Where(r => r["Name"].ToString() == rowView.Row["Name"].ToString()) 
           .ToList() 
           .ForEach(r => r.Delete()); 
        dataTable.AcceptChanges(); 
       } 
       dataAdapter.Update(dataTable); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

}

P.S:私はMVVM

を使用していないの助けをありがとうございました!

+0

例外はありますか? – ViVi

+0

例外なし:) – Dave

+0

データテーブルはどこから来たのですか?それが生成された場合、これは動作しないことは明らかですが、データベースからのテーブルの場合はこれが別のケースです。 –

答えて

0

forループをwhileループにリファクタリングすることを検討してください(例:while(datagrid.SelectedItem.Count> = 1)。ループ内のアイテムを削除した場合、インデックスに基づいてコレクションにアクセスするときに問題が発生します。

デバッグヒント:forループループ内の選択されたアイテムの数をチェックし、そのオブジェクトが@特定のインデックスに存在するかどうかを確認してください。

0

すべてが、私は構文以下DataTable使用から行を削除するには、推測する権利である:

datatable.Rows.Remove((myGrid.SelectedItem as DataRowView).Row); 

または第二のコードブロック内:

DataRowView rowView = dataGrid.SelectedItems[i] as DataRowView; 
     datatable.Rows.Remove(rowView.Row); 

そして最後には

datatable.AcceptChanges(); 

を置きます変更は適切に反映されるはずです。

0

私は返信していないのは申し訳なくして待っていました。 あなたの助言は私を大いに助けました。 私はこれが事実であることを決定した:

else if (dataGrid.SelectedItems.Count > 1) 
     { 
      while (dataGrid.SelectedItems.Count > 0) 
      { 
      int selectedIndex = dataGrid.SelectedIndex; 
      var row = dataTable.Rows[selectedIndex]; 
      row.Delete(); 

      dataAdapter.Update(dataTable); 
      } 
     } 

[SOLVED]

現在、私は真剣にMVVMへの応用変える考えています:D:D

1

このコードは、選択した行を削除する働きを。ご確認ください

while (Mydatagrid.SelectedItems.Count >= 1) 
{ 
DataRowView drv = (DataRowView)Mydatagrid.SelectedItem; 
drv.Row.Delete(); 
} 
関連する問題