2016-05-31 136 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-loop循環中所選項目的計數,並檢查對象是否存在@特定索引。

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

[解決]

目前我正在認真思考改變應用程序MVVM:d:d

1

此代碼刪除所選行。請確保

while (Mydatagrid.SelectedItems.Count >= 1) 
{ 
DataRowView drv = (DataRowView)Mydatagrid.SelectedItem; 
drv.Row.Delete(); 
}