【发布时间】:2011-06-06 12:31:00
【问题描述】:
我搜索了一个在多列上对 DataGridView 进行排序的示例,但似乎无法找到符合我要求的示例。
基本上,我有一个绑定的 DataGridView 控件(绑定到 DataTable/DataView),并且绑定的 DataTable 有两列:优先级和日期。我想按优先级的日期排序。也就是说,优先级列优先,然后是日期,但两者都可以升序或降序。
因此,例如,我可能有低优先级,提前日期优先 (按优先级 asc,日期 asc 排序),并且通过单击日期列标题,切换到低优先级,较晚日期第一个(按优先级升序排列,日期降序排列)。如果我然后单击优先级,我希望首先具有高优先级,然后是延迟日期(日期列的当前排序顺序 - order by priority desc, date desc),但随后能够单击日期列标题以切换到高优先级,早期日期(按优先级降序排列,日期升序)。
理想情况下,我希望对两列的字形进行排序以显示升序或降序。
任何想法或指点都将不胜感激。
这(见下文)似乎非常接近,但字形无法正常工作。
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
DataSet1 dataset;
public Form1()
{
InitializeComponent();
dataset = new DataSet1(); // two columns: Priority(Int32) and date (DateTime)
dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("01-jan-10"));
dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("02-jan-10"));
dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("03-jan-10"));
dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("04-jan-10"));
dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("05-jan-10"));
dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("06-jan-10"));
dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("07-jan-10"));
dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("08-jan-10"));
dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("09-jan-10"));
dataGridView1.DataSource = dataset.DataTable1.DefaultView;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;
dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;
dataGridView1.Columns[0].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
dataGridView1.Columns[1].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
}
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
DataGridViewColumn[] column = new[] { dataGridView1.Columns[0], dataGridView1.Columns[1] };
DataGridViewColumnHeaderCell headerCell = dataGridView1.Columns[e.ColumnIndex].HeaderCell;
if (headerCell.SortGlyphDirection != SortOrder.Ascending)
headerCell.SortGlyphDirection = SortOrder.Ascending;
else
headerCell.SortGlyphDirection = SortOrder.Descending;
String sort = column[0].DataPropertyName + " " + fnSortDirection(column[0])
+ ", "
+ column[1].DataPropertyName + " " + fnSortDirection(column[1]);
dataset.DataTable1.DefaultView.Sort = sort;
this.textBox1.Text = sort;
}
private String fnSortDirection(DataGridViewColumn column)
{
return column.HeaderCell.SortGlyphDirection != SortOrder.Descending ? "asc" : "desc";
}
}
}
【问题讨论】:
-
关于箭头字形的“工作不正常”是什么意思?我真的不想花时间编写排序代码,但我之前已经让这个看起来正确,现在看起来你已经大部分时间了。
-
嗯...第一列(优先级)的字形在上下之间切换,但第二列的字形似乎是某种三态,显示为向上,什么都没有, 没有。我猜 DGV 真的不喜欢同时有两个排序字形?我添加了带有“正常”排序的第三列,这看起来很好,但是(前两列上的字形消失了),但是单击第二列的标题然后在第一列上给我一个升序字形。
-
Google for
MultisortDataGridViewIIRC.
标签: c# sorting datagridview