【问题标题】:c# wpf - DataGrid delete selected rowsc# wpf - DataGrid 删除选中的行
【发布时间】:2023-03-24 05:36:01
【问题描述】:

我正在使用 c#、wpf、DataGrid、SqlDataAdapter、DataTable、MS Sql 服务器 在主窗体上有一个 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

非常感谢您的帮助!

【问题讨论】:

  • 是否捕获到任何异常?
  • 数据表从何而来?如果它是生成的,那么很明显这将不起作用,但是如果它是直接来自数据库的表,这是另一种情况。

标签: c# wpf datatable datagrid


【解决方案1】:

此代码用于删除选定的行。确定

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

【讨论】:

    【解决方案2】:

    您可以考虑将 for 循环重构为 while 循环,例如 while(datagrid.SelectedItem.Count >=1)。通常你会在基于索引访问集合时遇到问题,以防你在循环中删除一个项目。

    调试提示:尝试检查 for 循环中选定项的计数,并检查对象是否存在@特定索引。

    【讨论】:

      【解决方案3】:

      我猜一切都是对的,要从 DataTable 中删除行,请使用以下语法:

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

      或者在第二个代码块中:

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

      那么最后放

      datatable.AcceptChanges();
      

      更改应正确反映。

      【讨论】:

        【解决方案4】:

        很抱歉没有回复您,让您久等了! 你的建议对我帮助很大。 我决定是这样的:

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-09
          • 2014-12-17
          • 2019-10-26
          • 1970-01-01
          • 2014-08-22
          • 2015-01-26
          • 1970-01-01
          • 2012-05-20
          相关资源
          最近更新 更多