C# winform 中datagridview ,如何实现点击列头,对应的列自动排序。

如题所述

在使用 DataGridView时,对于数值列,默认的排序方式仍然是按照字符串方式进行

如果需要按照数值型进行排序,有几种办法,其中一种就是重载SortCompare方法

//重载_SortCompare方法

private void DataGridView1_SortCompare(object sender,DataGridViewSortCompareEventArgs e)

{

//   如果是学号或成绩列,则按浮点数处理

if(e.Column.Name=="学号"|| e.Column.Name=="成绩")

{

e.SortResult = (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) > 0) ? 1 : (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) < 0)?-1:0;

}

//否则,按字符串比较

else

{

e.SortResult = System.String.Compare(Convert.ToString(e.CellValue1), Convert.ToString(e.CellValue2));

}

// 如果发现两行相同,则按学号排序  

if (e.SortResult == 0 && e.Column.Name != "学号")

{

e.SortResult = Convert.ToInt32(DataGridView1.Rows[e.RowIndex1].Cells["学号"].Value.ToString()) -

Convert.ToInt32(DataGridView1.Rows[e.RowIndex2].Cells["学号"].Value.ToString());

}
e.Handled = true;//不能省掉,不然没效果
}  

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-01
DataGridView里面有个事件是ColumnHeaderMouseClick事件(用户单击列标题时发生事件),在事件中插入个排序的代码就可以了
第2个回答  2013-02-28
datagridview默认(就是从控件工具箱里拖出来创建到窗体,不修改任何设置)就是允许点击列标题排序.
排序是以当前列的数据为排序依据.
第3个回答  2013-02-28
DataGridView gridView;
gridView.Columns[XXX].SortMode = DataGridViewColumnSortMode.Automatic;
设置某一列可以自动排序,这样可以实现你的需求么?追问

不行,这个是默认的。
如果用非连接模式,dataGridView1.DataSource = ds.Tables["aa"];,点击列头可以排序的,
但为何用连接模式绑定,绑定dataGridView1.DataSource=list,就不行了呢?

追答

哦,那需要自定义排序了,把这一列的SortMode设置为DataGridViewColumnSortMode.Programmatic
在ColumnHeaderMouClick事件里自己给DataGridView的DataSource排序
这是我写的示例代码,希望对你有所帮助
DataGridView gridView;
gridView.Columns[XXX].SortMode = DataGridViewColumnSortMode.Programmatic;
void ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
//取得点击列的索引
int nColumnIndex = gridView.HitTest(e.X, e.Y);
if (!gridView.Columns[nColumnIndex].SortMode == DataGridViewColumnSortMode.Programmatic)
{
return;
}
switch (gridView.Columns[nColumnIndex].HeaderCell.SortGlyphDirection)
{
case SortOrder.None:
case SortOrder.Ascending:
//在这里加入排序的逻辑
//设置列标题的状体
gridView.Columns[nColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
default:
gridView.Columns[nColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
break;
}
}

本回答被提问者和网友采纳
第4个回答  2019-09-10

    SortMode属性默认为Automatic

    使用DataGridView里面的ColumnHeaderMouseClick事件来重写这段逻辑

下面为我的代码

private void dgvCst_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
switch (dgvCst.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection)

{
case SortOrder.None:
case SortOrder.Ascending:

              List<Data> _lst = (from cst in Data.Where(条件)select cst).OrderByDescending(r => r.UPDATETIME).ToList();
dgvCst.DataSource = _lst;
dgvCst.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
break;
default:

             List<Data> _lst1 = (from cst in Data.Where(条件) select cst).OrderBy(r => r.UPDATETIME).ToList();

             dgvCst.DataSource = _lst1;
dgvCst.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
}

}

点击Header列名,可以实现排序功能

C# winform 中datagridview ,如何实现点击列头,对应的列自动排序?
\/\/ 如果发现两行相同,则按学号排序 if (e.SortResult == 0 && e.Column.Name != "学号"){ e.SortResult = Convert.ToInt32(DataGridView1.Rows[e.RowIndex1].Cells["学号"].Value.ToString()) - Convert.ToInt32(DataGridView1.Rows[e.RowIndex2].Cells["学号"].Value.ToString());...

C# winform datagrideview如何实现点击列标题实现按该列升序或降序排列...
1、DataGridView中的列本身就带有点一下就排序的功能;2、DataGridView列的属性有一个SortMode可以设排序,3、如果DataGridView的数据源是DataTable,可以指定DataTable排序 dataGridView.DataSource = tblDetail.DefaultView;tblDetail.DefaultView.Sort = "Time";...

C# winform中如何设置datagirdview的属性使之能够点击列标题排序
dgv.AllowUserToOrderColumns=true; \/\/启用列重新排序

c#DataGridView选择第一列第二列与第三列自动填入数据库中信息,急急...
下面的代码就是 GridView绑定数据时,就把把获取到的表对象的列名和你的BoundField指定 datafield的名称一一对应。比如说你的那个表中的第一列设置的Datafield是A表中的字段name,那么最后呈现内容的时候就是显示name那一列的数据。

C#winform中的 dataGridView 鼠标点行首时选中整行,点击单元格时 选中...
可以,你用下面的代码:private void dgvReceive_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex!=-1 ) { if (e.ColumnIndex==-1) { dgvReceive.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dgvReceive.Rows[e.RowIndex].Selected ...

c#控件DataGridView单击列头没有自动排序,为什么?
\/\/ 数据源 source ---排序列(字段) sortfield ---List的对象Type jjType---排序属性PropertyInfo List<jj> source = new List<jj>();private string sortfield = string.Empty;Type jjType = typeof(jj);System.Reflection.PropertyInfo field;\/\/ 初始化datagridView private void btnCSV_Click...

C# winform DataGridView如何控制列排序?
列自动生成,最简单的方法就是在SQL语句中指定字段的顺序。你说的不同的用户想要不同的顺序,你可以根据用户的不同构造不同的SQL语句,然后将之绑定。如果用了DataSet,用DataView也可以实现排序。

C#对datagridview数据排序
排序原理一般是因为DataView有排序功能.下面方法对DataGrid和GridView都适用,操作步骤如下:1.在需要排序的字段里加:SortExpression,如:<asp:BoundColumn DataField="D_DATE" HeaderText="申报日期" SortExpression="D_DATE"> <\/asp:BoundColumn> --- 2.在PageLoad()里:(即开始Load页面时以什么方式排序...

C# winform datagridview 列顺序的问题?
public class ccc { private string id;private string name;public string Id { get { return id; } set { id = value; } } public string Name { get { return name; } set { name = value; } } } 例子里的 Id,Name ,谁在上面,绑定的时候谁就在前面。

C#中,怎样让DataGridView的 列宽 按照 列名 的长短自动变更?也就是让...
如果你的DataGridView是动态绑定数据的,那就只能在代码中设置。如果你的DataGridView列名是设计好的,那么可以在DataGridView上点击右键,选择“编辑列”,然后选中你要设置自适应的列,在它的属性列表中的“布局”选项卡里面选择AutoSizeMode的类型。AutoSizeMode属性可以设置的值还有不少:成员名称 说明 No...

相似回答