简体   繁体   English

c# wpf - DataGrid 删除选定的行

[英]c# wpf - DataGrid delete selected rows

I am using c #, wpf, DataGrid, SqlDataAdapter, DataTable, MS Sql server On the main form there is a DataGrid and a button.我正在使用 c#、wpf、DataGrid、SqlDataAdapter、DataTable、MS Sql server 在主窗体上有一个 DataGrid 和一个按钮。 Clicking on the button should be removed from the DataGrid selected lines.单击按钮应从 DataGrid 中删除选定的行。 And then from the database.然后从数据库中。 But this is not happening!但这不会发生! Only from the DataGrid!仅来自 DataGrid! Here is my code:这是我的代码:

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

} }

PS: I do not use MVVM PS:我不使用MVVM

Thank you very much for the help!非常感谢你的帮助!

This code works to delete selected rows.此代码用于删除选定的行。 Be sure确定

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

You may consider refactoring the for-loop into a while loop., eg while(datagrid.SelectedItem.Count >=1).您可以考虑将 for 循环重构为 while 循环。例如,while(datagrid.SelectedItem.Count >=1)。 Generally you will encounter issues when accessing an collection based on index, in case if you delete an item within a loop.通常,在基于索引访问集合时会遇到问题,以防在循环中删除项目。

Debug Tip: Try to check count of selected Items within the for-loop loop and check if the object exists @ particular index.调试提示:尝试检查 for 循环中所选项目的计数,并检查对象是否存在@特定索引。

Everything is right I guess, to remove rows from DataTable use following syntax:我猜一切都是正确的,要从DataTable删除行,请使用以下语法:

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

Or in second code block:或者在第二个代码块中:

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

then at last put然后最后放

datatable.AcceptChanges();

changes should reflected properly.变化应正确反映。

I'm sorry for not having replied and kept you waiting!很抱歉没有回复,让您久等了! Your advice helped me a lot.你的建议对我帮助很大。 I have decided this is the case:我已经决定是这种情况:

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] [解决了]

currently I am thinking seriously alter the application to MVVM :D:D目前我正在认真考虑将应用程序更改为 MVVM :D:D

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM