首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在用户单击列标题时启用DataGridView排序?

如何在用户单击列标题时启用DataGridView排序?
EN

Stack Overflow用户
提问于 2011-04-05 22:01:39
回答 16查看 168.1K关注 0票数 76

我的表单上有一个datagridview,我用下面的代码填充它:

代码语言:javascript
复制
dataGridView1.DataSource = students.Select(s => new { ID = s.StudentId, RUDE = s.RUDE, Nombre = s.Name, Apellidos = s.LastNameFather + " " + s.LastNameMother, Nacido = s.DateOfBirth })
                                   .OrderBy(s => s.Apellidos)
                                   .ToList();

现在,我使用s.Apellidos作为默认排序,但我也希望允许用户在单击列标题时进行排序。

这种排序不会以任何方式修改数据,这只是一个客户端的好处,以允许更容易搜索信息时,他们的眼睛扫描屏幕。

谢谢你的建议。

EN

回答 16

Stack Overflow用户

发布于 2011-04-05 22:07:09

将所有列(可由用户排序)的SortMode属性设置为Automatic

代码语言:javascript
复制
dataGridView1.DataSource = students.Select(s => new { ID = s.StudentId, RUDE = s.RUDE, Nombre = s.Name, Apellidos = s.LastNameFather + " " + s.LastNameMother, Nacido = s.DateOfBirth })
                                   .OrderBy(s => s.Apellidos)
                                   .ToList();

    foreach(DataGridViewColumn column in dataGridView1.Columns)
    {
    
        column.SortMode = DataGridViewColumnSortMode.Automatic;
    }

编辑:当您的datagridview与linq查询绑定时,它将不会被排序。因此,请阅读这个[404 dead link, see next section],它解释了如何创建一个可排序的绑定列表,然后将其作为数据源提供给datagridview。

从死链接恢复的代码

上面的链接是404-死了。我从网页的互联网回路机archive中恢复了代码。

代码语言:javascript
复制
public Form1()
{
    InitializeComponent();

    SortableBindingList<person> persons = new SortableBindingList<person>();
    persons.Add(new Person(1, "timvw", new DateTime(1980, 04, 30)));
    persons.Add(new Person(2, "John Doe", DateTime.Now));

    this.dataGridView1.AutoGenerateColumns = false;
    this.ColumnId.DataPropertyName = "Id";
    this.ColumnName.DataPropertyName = "Name";
    this.ColumnBirthday.DataPropertyName = "Birthday";
    this.dataGridView1.DataSource = persons;
}
票数 51
EN

Stack Overflow用户

发布于 2011-04-06 02:15:23

按照Niraj的建议,使用SortableBindingList.我已经在DataGridView中非常成功地使用了这一点。

下面是我使用的更新代码的链接- Presenting the SortableBindingList - Take Two - archive

只需将这两个源文件添加到您的项目中,您就可以开始工作了。

源代码在SortableBindingList.zip - 404 dead link

票数 28
EN

Stack Overflow用户

发布于 2017-04-19 09:10:29

另一种方法是使用"System.Linq.Dynamic“库。您可以从Nuget获得此库。不需要任何自定义实现或可排序列表:)

代码语言:javascript
复制
using System.Linq.Dynamic;
private bool sortAscending = false;

private void dataGridView_ColumnHeaderMouseClick ( object sender, DataGridViewCellMouseEventArgs e )
{
    if ( sortAscending )
        dataGridView.DataSource = list.OrderBy ( dataGridView.Columns [ e.ColumnIndex ].DataPropertyName ).ToList ( );
    else
        dataGridView.DataSource = list.OrderBy ( dataGridView.Columns [ e.ColumnIndex ].DataPropertyName ).Reverse ( ).ToList ( );
    sortAscending = !sortAscending;
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5553100

复制
相关文章

相似问题

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