2016-05-31 344 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(); 
}