C# DataGridView 列排序

12

在我的应用程序中,我有一个 DataGridView,其数据源根据您单击的按钮而变化。

例如,单击“总下载量”将是:

dataGridView1.DataSource = totalDownloads();

或每个玩家的下载次数

dataGridView1.DataSource = playerDownloads();
每种方法通过SQL查询获取数据并返回此信息的dataTable
但是,对于我接下来的代码:
dataGridView1.DataSource=getStats();
public DataTable getStats()
   {
        DataTable table1 = new DataTable("Totals");
        table1.Columns.Add("Park Name");
        table1.Columns.Add("Author");
        table1.Columns.Add("Total Downloads");
        table1.Columns[2].DataType = typeof(int);
        table1.Columns.Add("Rating (Max 5)");           
        table1.Columns[3].DataType = typeof(float);
        table1.Rows.Add(name,author,download, rating);
        }
        return table1;
    }

我期望看到的列顺序是:“公园名称”、“作者”、“总下载量”和“评分”。但实际上它们的顺序是“下载量”、“公园名称”、“作者”和“评分”。

我读过添加dataGridView1.AutoGenerateColumns = false;可以解决这个问题……但实际上,这根本不会改变顺序……

8个回答

23

这是一个WinForms项目还是Asp.net项目?

如果是WinForms项目,你应该能够通过访问GridView的列DisplayIndex来改变列的显示顺序。

    dataGridView1.Columns["Park Name"].DisplayIndex = 0; // or 1, 2, 3 etc

1
感谢您的回答。虽然这个方法可以解决问题,但我很好奇为什么它们一开始没有按正确顺序出现。我经常在更大的项目中使用DataGridView,但以前从未遇到过这种情况... - user1662290
是的,很有趣。我本以为它们会默认按添加的顺序排序。你尝试过完全重启/清理项目吗?只是为了确保没有缓存任何内容。 - Mikey Mouse

11

我的解决列顺序混乱的简单方法是添加这个循环,将 DisplayIndex 设置为 Index

foreach (DataGridViewColumn col in grid.Columns) {
    col.DisplayIndex = col.Index;
}

当添加列时,Index会分配给每一列。我不确定为什么DisplayIndex会变得无序,但以上脚本将解决这个问题。

以下代码也可以作为一行解决:

grid.Columns.foreach(c => c.DisplayIndex = c.Index);

这解决了我的问题。在生成的 SQL 查询中,列是动态排序的,但有时它们会在某些表上失去顺序。您发布的解决方案完美地解决了这个问题。谢谢! - Lord Helmet

9
对我来说这并没有起到作用。 还需要再加一行:
entityDataGridView.AutoGenerateColumns = false;

问候!


如果您正在使用数据库,那么几乎总是希望将其设置为true。 - Michael Z.

5
尝试像这样调整显示索引:

尝试像这样调整显示索引:

 private void AdjustColumnOrder()
{
    customersDataGridView.Columns["Park Name"].DisplayIndex = 0;
    customersDataGridView.Columns["Author"].DisplayIndex = 1;
    customersDataGridView.Columns["Total Downloads"].DisplayIndex = 2;
}

2

我曾经遇到过同样的问题,我通过以下方法解决了:

dataGridView.DataSource = null;
dataGridView.DataSource = MyDataTable;

1
I found this to be very helpful.(我发现这非常有帮助。)
Usage: ColumnDisplayOrder("Park Name, Author, Total Downloads", myDataGridView);(用法:ColumnDisplayOrder("公园名称,作者,总下载量",myDataGridView);)
    private void ColumnDisplayOrder(string columnList, DataGridView gridView)
    {
        var columnListArray = columnList.Split(',');
        for (var i = 0; i < columnListArray.Length; i++)
        {
            var gridViewColumn = gridView.Columns[columnListArray[i].Trim()];
            if (gridViewColumn != null)
                gridViewColumn.DisplayIndex = i;
        }
    }

这很有趣。我得有机会尝试一下。 - Michael Z.

1

我遇到了同样的问题并找到了原因。这是由于类属性的顺序造成的:

   public string Downloads { get; set; }
   public string ParkName { get; set; }
   public string Author { get; set; }
   public float Rating { get; set; }

为您提供 下载、公园名称、作者、评分

如果您重新排列它们,顺序应该符合您的预期。


0

我在数据网格中遇到了列顺序的问题,我的项目数据源是对象列表,通过设计器我按正确顺序添加了列,但当我启动应用程序时,顺序却混乱了。当我在类中为我的属性添加绑定时,我注意到我的属性与数据网格中的列顺序不一致,因此我按照添加列的顺序在类中添加了属性,即使将 AutoGenerateColumns 设置为 true,我也得到了正确的顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接