【问题标题】:Unexpected result in deleting DataGridView Columns删除 DataGridView 列时出现意外结果
【发布时间】:2011-08-12 15:30:37
【问题描述】:
        DataTable dt = new DataTable();
        dt.Columns.Add("col1");
        dt.Columns.Add("col2");
        dt.Columns.Add("col3");
        dt.Columns.Add("col4");
        dt.Columns.Add("col5");
        dataGridView1.DataSource = dt;
        dataGridView1.Columns.RemoveAt(3);
        dataGridView1.Columns.RemoveAt(2);
        dataGridView1.Columns.RemoveAt(0);

在这个程序中,我创建了一个包含 5 列的 DataTable。这将是 DataGridView 的 DataSource。 DataTable 中的某些列不需要用户看到,但稍后会被程序使用。

在最后一行之后,列排列为:col2、col5、col1、col3、col4。为什么会出现这样的情况?它不应该从 DataGridView 中删除吗?我应该怎么做才能让它显示为“col2,col5”?

编辑:我想从 DataGridView 中删除一些列,但仍可在 DataTable 中使用。此外,它在事件中工作(如 Button_Click)

编辑:我仍然还没有弄清楚为什么会这样。我别无选择,只能创建另一个线程(BackgroundWorker)来执行此操作...

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        DataTable dt = new DataTable();
        int i;
        dataGridView1.Invoke((MethodInvoker)delegate
        {
            dt.Columns.Add("col1");
            dt.Columns.Add("col2");
            dt.Columns.Add("col3");
            dt.Columns.Add("col4");
            dt.Columns.Add("col5");
            dataGridView1.DataSource = dt;
            dataGridView1.Columns.RemoveAt(3);
            dataGridView1.Columns.RemoveAt(2);
            dataGridView1.Columns.RemoveAt(0);
        });
    }

据我所知,Haris Hasan 是对的;包含 DataGridView 的表单应至少出现一次。但我仍然很困惑为什么......

【问题讨论】:

    标签: c#


    【解决方案1】:

    据我所知,您必须先显示一次 DataGridView,然后才能删除任何列。尝试显示 DataGridView 一次,然后删除列,看看会发生什么

    【讨论】:

    • 我之前做过。我将代码放在我删除按钮事件中的列的位置,当我单击按钮时这些列被删除。为什么当列的删除低于“dataGridView1.DataSource = dt;”时不会发生这种情况?
    • 我不知道为什么会发生这种情况,但我知道会发生这种情况。您可以做的是处理一个事件,该事件在 DataGridView 显示后立即引发,并在该事件中删除列
    • @Gerald 对不起,我真的很困惑......!你是说RemoveAt 没有删除该列?
    • 我在 BackgroundWorker RunWorkerCompleted 事件中调用的方法中使用了这段代码,它可以工作。在表单的构造函数内部时,相同的方法无法正常工作...如果未调用 RunWorkerAsync(),我可以在 Backgroundworker RunWorkerCompleted 中引发事件吗?
    • @Knvn,是的!我不知道为什么!显然,如果在事件发生时将其删除,它确实会删除该列。
    【解决方案2】:

    您可以尝试设置它们的可见性,而不是删除列...

            dataGridView1.DataSource = dt;
            dataGridView1.Columns[3].Visible = false;
            dataGridView1.Columns[2].Visible = false;
            dataGridView1.Columns[0].Visible = false;
    

    【讨论】:

    • 如果我执行 MessageBox.Show(dataGridView1.Columns[0].Name);,它仍然是“col1”。我在程序的另一部分使用了 RemoveAt()。两者之间的唯一区别是我使用另一个线程将值存储在 DataTable 中。之后,我做了与上面相同的操作。奇怪的是,那个有效。
    • 当您运行MessageBox.Show(dataGridView1.Columns[0].Name); 时,它将是col1,只是因为您只是在更改可见性模式。
    【解决方案3】:

    您可以使用 DataGridViewDisplayIndex 属性对列进行排序。为了隐藏列,您可以将特定列的 Visible 属性设置为 false。

    dataGridView1.Columns["ColumnTobeHided"].Visible = false;
    

    【讨论】:

    • 但这就是用来改变列的排列的。我不希望显示其他列。我使用了 RemoveAt(),但它没有删除它们。那些“应该”被删除的列刚刚被移到 dataGridView1 的末尾。
    【解决方案4】:

    如果您不希望表格中所有列的列在网格中,请在将数据表绑定到数据源之前将 datagridview.AutoGenerateColumns 设置为 false。然后创建并绑定您实际想要的 datagridview 列。

    AutoGenerateColumns 默认为 true,但它很少能提供我们真正想要的东西。花点时间完全按照您的需要构建您的 datagridview 列,不要相信默认处理。

    【讨论】:

    • 我不希望 所有 列,但我只希望其中 一些 出现在 DataGridView 上。 “出现”是指从那里删除这些列,而不仅仅是隐藏它们......
    • 如果您将 AutoGenerateColmuns 设置为 false,默认情况下您将不会获得任何列。然后,您可以添加代码来创建所需的特定列。 AutoGenerateColumns = true 为 DataTable 中的每一列创建一个 DGV 列,这不是您想要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2013-11-07
    • 2015-05-30
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多