我正在使用c#,wpf,DataGrid,SqlDataAdapter,DataTable,MS Sql server 在主窗体上有一个DataGrid和一个按钮。 应该从DataGrid选定的行中删除单击该按钮。然后从数据库。但这不会发生!仅来自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 :(得分:1)
此代码用于删除选定的行。确保
while (Mydatagrid.SelectedItems.Count >= 1)
{
DataRowView drv = (DataRowView)Mydatagrid.SelectedItem;
drv.Row.Delete();
}
答案 1 :(得分:0)
您可以考虑将for循环重构为while循环。例如while(datagrid.SelectedItem.Count> = 1)。通常,在基于索引访问集合时会遇到问题,以防您在循环中删除项目。
调试提示:尝试检查for循环循环中所选项的计数,并检查对象是否存在@特定索引。
答案 2 :(得分:0)
一切都是正确的我想,要从DataTable
删除行,请使用以下语法:
datatable.Rows.Remove((myGrid.SelectedItem as DataRowView).Row);
或者在第二个代码块中:
DataRowView rowView = dataGrid.SelectedItems[i] as DataRowView;
datatable.Rows.Remove(rowView.Row);
然后最后提出
datatable.AcceptChanges();
变化应该反映得恰到好处。
答案 3 :(得分: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