添加列并使用SetOrdinal后,在DataGridView中刷新列顺序

时间:2017-04-21 03:12:04

标签: c# datagridview datatable binding

我有一个显示摘要数据的DataGridView。它绑定到绑定到DataTable的BindingSource。根据用户选择的摘要类型,程序可能会将数据拆分为多个列。在我的代码中,我更新现有列并根据需要添加列。正如预期的那样,新列将添加到列表的末尾,并使用SetOrdinal重新定位它。但是,DataGridView永远不会移动列,除非我将DataSource空白并重新绑定到BindingSource,如下所示:

我使用以下代码添加列:

                    this.Columns.Add(newcolumn);
                    this.Columns[columnname].SetOrdinal(index++);

我刷新源代码如下:

        teamstats.UpdateColumn(teamstats.Columns[columnClicked].ColumnName);
        bsTBAstats.DataSource = null;
        bsTBAstats.DataSource = teamstats;

这是有问题的,因为在刷新DataGridView之后,我必须为每个列重新应用我的格式(单元格和事件处理程序),这会显着减慢进程。

是否有更有效的方法让DataTable刷新列顺序?如果用户可以手动重新排序列,为什么我不能以编程方式进行排序?

1 个答案:

答案 0 :(得分:0)

我发现完成上述问题的最佳方法是手动调用DataGridView中的列以匹配DataTable中列的顺序。以下代码显示了我使用的过程:

        foreach (DataColumn c in teamstats.Columns)
            dgvTBAstats.Columns[c.ColumnName].DisplayIndex = teamstats.Columns.IndexOf(c);

似乎绑定过程应该自动执行此操作,但这可行。不幸的是,如果用户手动重新排序列,则该顺序将丢失,因为相反的情况是正确的,并且DataTable不会重新排序以匹配DataGridView。

我似乎无法找到更好的方法来绑定列顺序。