winforms 更改绑定到DataGridView的DataTable中的列顺序不会反映在视图中

wkftcu5l  于 2023-10-23  发布在  其他
关注(0)|答案(4)|浏览(123)

当应用程序运行时,DataGridView被绑定到DataTable。稍后,我以编程方式将更多列添加到DataTable中,这将反映在底层数据中,即列序号是他们应该是。但是,这并没有反映在DataGridView中。相反,列被附加到最初生成的集合上。
这个例子表明,

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public DataTable data = new DataTable();

    private void button1_Click(object sender, EventArgs e)
    {

        this.dataGridView1.DataSource = data;
        for (int i = 0; i < 5; i++)
        {
            this.data.Columns.Add(i.ToString());
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        DataColumn foo = new DataColumn();
        this.data.Columns.Add(foo);
        foo.SetOrdinal(0);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        foreach (DataColumn tmpCol in this.data.Columns)
        {
            Console.WriteLine("{0} : {1}", tmpCol.ColumnName, tmpCol.Ordinal);
        }
    }
}

按钮1生成列,按钮2添加列并将序号设置为0,因此它应该是网格中的第一个,按钮3显示列的序号并显示它们在DataTable中的位置。

iqxoj9l9

iqxoj9l91#

这就是DataGridView的工作原理;在启用自动生成列的情况下,额外的(未Map的)列被附加到末尾。你可以解绑和重新绑定来修复它;将DataSource设置为null并返回到表:

this.dataGridView1.DataSource = null;
this.dataGridView1.Columns.Clear();
this.dataGridView1.DataSource = data;
eagi6jfj

eagi6jfj2#

我也遇到过类似的问题,并使用DataGridViewColumn.DisplayIndex属性解决了这个问题。

dgvData.Columns["COLUMN_NAME"].DisplayIndex = 0;  // will move your custom column to first position
tnkciper

tnkciper3#

不要忘记打开和关闭AutoColumnCreate,以确保您的DisplatIndex的工作。
http://www.internetworkconsulting.net/content/datadridview-displayorder-not-working

46qrfjad

46qrfjad4#

请看下面Koryu的回答!下面的解决方案在动态地将dgv绑定到绑定数据源之后提供了更精细的控制:

BindingSource bindingSource = new BindingSource();
dgvData.AutoGenerateColumns = true;
bindingSource.DataSource = new myDataClass() { T = 5, TR = 5, K = 0, t = 3, N = 3600 };
dgvData.DataSource = bindingSource;
dgvData.Columns["T"].DisplayIndex = 0;    //******* Koryu's answer below

相关问题