【问题标题】:How to delete multiple rows in DataGridView?如何删除 DataGridView 中的多行?
【发布时间】:2020-03-05 02:47:18
【问题描述】:

我在 winform 上有一个 DataGridView。下面是一个重现问题的工作示例。网格有两列 - 复选框和文本框。我正在创建两行数据。

我循环并得到任何选中的行。然后我尝试删除它们。在我删除行的循环中,第一次迭代一切顺利。 r.Index 为 0。

进入第二次迭代是事情崩溃的地方。 r.Index 现在为 -1,r.Cells[1].Value 为空。

为什么会发生这种情况以及删除这些行的正确方法是什么?

public Form1() 
{
List<data> dataList = new List<data>();
dataList.Add(new data() {IsChecked=true, dept="dept1"});
dataList.Add(new data() {IsChecked=true, dept="dept2"});
BindingListView<data> view = new BindingListView<data>(dataList);
dataGridView1.DataSource = view;

var rows = SelectedRows();
foreach (DataGridViewRow r in rows) {
  var name = r.Cells[1].Value.ToString();
  dataGridView1.Rows.Remove(r);
}

List<DataGridViewRow> SelectedRows() {
  List<DataGridViewRow> rows = new List<DataGridViewRow>();
  foreach (DataGridViewRow row in dataGridView1.Rows) {
    if (Convert.ToBoolean(row.Cells[0].Value)) {
      rows.Add(row);
    }
   }
   return rows;
}

}


public class data 
{
  public bool IsChecked {get;set;}
  public string dept {get;set;}
}

BindingListView 类来自这里:http://blw.sourceforge.net

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    您可以从BindingListView&lt;Data&gt; 中删除选中的项目。更改将立即显示在DataGridView

    foreach (var item in view.ToList())
    {
        if (item.IsChecked)
            view.Remove(item);
    }
    

    使用ToList() 创建一个不同的List&lt;Data&gt; 用于循环中,因此允许从原始列表中删除项目并且不会更改我们在循环中使用的列表。

    作为另一种选择,您可以通过这种方式从DataGridView 中删除该行。更改将立即在BindingListView&lt;Data&gt; 中进行:

    dataGridView1.Rows.Cast<DataGridViewRow>()
        .Where(row => (bool?)row.Cells[0].Value == true)
        .ToList().ForEach(row =>
        {
            dataGridView1.Rows.Remove(row);
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2023-03-04
      相关资源
      最近更新 更多