首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么dataGridView.Rows.Clear()不能工作?

为什么dataGridView.Rows.Clear()不能工作?
EN

Stack Overflow用户
提问于 2022-06-09 10:28:16
回答 2查看 93关注 0票数 0

我有一个带有默认设置的WinForms应用程序,其DataGridView集允许用户添加行。但是我也想以编程的方式删除行。

当我运行函数dataGridView.Rows.Clear()时,什么都不会发生--行保留在DataGridView中。

我甚至更改了编辑模式,删除了数据源,并刷新了:

代码语言:javascript
运行
复制
dataGridView.EditMode = DataGridViewEditMode.EditProgrammatically;
dataGridView.DataSource = null;
dataGridView.Rows.Clear();
dataGridView.Refresh();
dataGridView.EditMode = DataGridViewEditMode.EditOnKeystroke;

但是,用户添加的行在DGV中仍然可见。我怎样才能移除这些行?

编辑:DGV的截图:

EN

回答 2

Stack Overflow用户

发布于 2022-06-09 10:38:51

您试过迭代dataGridViewError.Rows集合并逐个删除吗?

代码语言:javascript
运行
复制
 foreach (DataGridViewRow row in dataGridViewError.Rows)   
 {
  try
  {
    dataGridViewError.Rows.Remove(row);
  }
  catch (Exception) { } 
}
票数 0
EN

Stack Overflow用户

发布于 2022-06-09 13:50:20

您的问题是为什么dataGridView.Rows.Clear()不能工作,答案是您的已发布代码对DataSource属性进行了操作,但是该属性似乎没有被正确设置(或使用)。

首先,您需要一个类作为行的模型(换句话说,它声明您希望在DataGridView中拥有的列)。创建属性{get;set;}意味着用户将能够在DataGridView中编辑这些属性。

代码语言:javascript
运行
复制
public class Record
{
    public string Licznic { get; set; }
    public string Procent { get; set; }
}

使automatically易于使用的是,它被设计为基于这个类来配置自己的DataGridView。只需创建一个BindingList<Record>并通过在主窗体类中重写OnHandleCreated将其附加到DataSource属性:

代码语言:javascript
运行
复制
BindingList<Record> DataSource = new BindingList<Record>();
protected override void OnHandleCreated(EventArgs e)
{
    base.OnHandleCreated(e);

    // Attach the DataSource to your DataGridView
    // Now changes to source records refresh in the view.
    dataGridView1.DataSource = this.DataSource;

    // Adding one or more records will generate the columns.
    DataSource.Add(new Record { Licznic = "ABC123", Procent = "XYZ" });
    DataSource.Add(new Record { Licznic = "DEF456", Procent = "PQR" });

    // Use string indexer to get a column
    dataGridView1.Columns[nameof(Record.Licznic)].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    dataGridView1.Columns[nameof(Record.Licznic)].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}

如果运行此代码,就会得到以下内容:

当单击UI上的clear按钮时,它现在在DataSource上工作,而不是UI,您会发现这非常有效:

代码语言:javascript
运行
复制
private void buttonClear_Click(object sender, EventArgs e)
{
    DataSource.Clear();
}

编辑

根据数据网格视图被加载为空的注释,在OnHandleCreated中进行这个小的更改以实现初始状态:

代码语言:javascript
运行
复制
// Adding one or more records will generate the columns.
DataSource.Add(new Record { Licznic = "", Procent = "" });

// Based on your comment that the DataGridView is "Loaded Empty"
// you would want to clear this record immediately after the
// automatic configuration has taken place.
DataSource.Clear();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72558745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档