datagridview 排序错误,是微软的BUG吗?

yumanqing 2009-04-11 09:45:44
winform中DatagridView点列头排序如何才能俺数字或日期类型的排序呢?
  dataGridView1.Rows.Add(8);
dataGridView1.Rows[0].Cells[0].Value = "10";
dataGridView1.Rows[1].Cells[0].Value = "5";
dataGridView1.Rows[2].Cells[0].Value = "112";
dataGridView1.Rows[3].Cells[0].Value = "201";
dataGridView1.Rows[4].Cells[0].Value = "22";
dataGridView1.Rows[5].Cells[0].Value = "320";
dataGridView1.Rows[6].Cells[0].Value = "45";
dataGridView1.Rows[7].Cells[0].Value = "950";


排出来结果如何才能从小到大或从大到小?
...全文
301 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
yagebu1983 2009-04-12
  • 打赏
  • 举报
回复
排序事件写了吗。。。
spmzfz 2009-04-12
  • 打赏
  • 举报
回复
支持 13 楼


this.dataGridView1.Columns.Clear();
this.dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());//必须首先添加列, DataGridViewTextBoxColumn()
//this.dataGridView1.Columns[0].ValueType = typeof(int);

this.dataGridView1.Rows.Add(8);

dataGridView1.Rows[0].Cells[0].Value = 10;
dataGridView1.Rows[1].Cells[0].Value = 5;
dataGridView1.Rows[2].Cells[0].Value = 112;
dataGridView1.Rows[3].Cells[0].Value = 201;
dataGridView1.Rows[4].Cells[0].Value = 22;
dataGridView1.Rows[5].Cells[0].Value = 320;
dataGridView1.Rows[6].Cells[0].Value = 45;
dataGridView1.Rows[7].Cells[0].Value = 950;

//this.dataGridView1.Sort(this.dataGridView1.Columns[0], ListSortDirection.Ascending);
hernmmy 2009-04-12
  • 打赏
  • 举报
回复
好,很好
XIAOYANJIANJIAN 2009-04-12
  • 打赏
  • 举报
回复
我倒有一个方法,就是用数组来存储要排序的数据。再用Array.Sort(数组名称)排序;
然后循环该排好序的数组,在循环里加这个: dataGridView1.Rows[1].Cells[0].Value =数组[下标]
liudanking 2009-04-12
  • 打赏
  • 举报
回复
就是字符串的问题。
你不是数字类型,排序当然不是你以为的数字大小的排序了
wartim 2009-04-12
  • 打赏
  • 举报
回复
晕,你非要把简单事情复杂化
yumanqing 2009-04-11
  • 打赏
  • 举报
回复
效果是实现了,还有点晕,我再看看,感谢
yumanqing 2009-04-11
  • 打赏
  • 举报
回复
仍然未解决,继续等待中....
zgke 2009-04-11
  • 打赏
  • 举报
回复
我给你写完把...

public class DataGridViewComparer : IComparer
{
private DataGridViewColumn m_Column;

public DataGridViewComparer(DataGridViewColumn p_Column)
{
m_Column = p_Column;
}
int IComparer.Compare(Object x, Object y)
{
if (m_Column == null) return -1;
decimal _X;
decimal _Y;

bool _XConvert = decimal.TryParse(((DataGridViewRow)x).Cells[m_Column.Name].Value.ToString(), out _X);
bool _YConvert = decimal.TryParse(((DataGridViewRow)y).Cells[m_Column.Name].Value.ToString(), out _Y);
int _CompareValue = _X.CompareTo(_Y);

if (m_Column.HeaderCell.SortGlyphDirection == SortOrder.Descending) return _CompareValue * -1;

return _CompareValue;
}
}



使用..


private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Columns.Add("123", "33");
dataGridView1.Rows.Add(8);
dataGridView1.Rows[0].Cells[0].Value = "10";
dataGridView1.Rows[1].Cells[0].Value = "5";
dataGridView1.Rows[2].Cells[0].Value = "11278.0";
dataGridView1.Rows[3].Cells[0].Value = "201";
dataGridView1.Rows[4].Cells[0].Value = "22";
dataGridView1.Rows[5].Cells[0].Value = "320";
dataGridView1.Rows[6].Cells[0].Value = "1.45";
dataGridView1.Rows[7].Cells[0].Value = "0.950";
dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;

}

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == 0)
{
//System.Windows.Forms.DataGridViewColumnHeaderCell
if (dataGridView1.Columns[0].HeaderCell.SortGlyphDirection == SortOrder.Ascending)
{
dataGridView1.Columns[0].HeaderCell.SortGlyphDirection = SortOrder.Descending;
dataGridView1.Sort(new DataGridViewComparer(dataGridView1.Columns[0]));
}
else
{
dataGridView1.Columns[0].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
dataGridView1.Sort(new DataGridViewComparer(dataGridView1.Columns[0]));
}
}
}
yumanqing 2009-04-11
  • 打赏
  • 举报
回复
十分感谢Cloud,不过我重新建立一个工程,排序的结果是:

还是有一点小问题
zgke 2009-04-11
  • 打赏
  • 举报
回复
dataGridView1.Rows[0].Cells[0].Value = "10";
dataGridView1.Rows[1].Cells[0].Value = "5";
dataGridView1.Rows[2].Cells[0].Value = "11278.0";
dataGridView1.Rows[3].Cells[0].Value = "201";
dataGridView1.Rows[4].Cells[0].Value = "22";
dataGridView1.Rows[5].Cells[0].Value = "320";
dataGridView1.Rows[6].Cells[0].Value = "1.45";
dataGridView1.Rows[7].Cells[0].Value = "0.950";


我这里 11278.0在最后一位
wartim 2009-04-11
  • 打赏
  • 举报
回复
dataGridView1.Columns[0].CellTemplate.ValueType =typeof(int); 可以省略
wartim 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yumanqing 的回复:]
ilikeff8 的方法排出来的是:10 45 950 320 22 201 好像也不是按大-》小或 小->大的顺序
[/Quote]
被你误导了,用什么引号啊,直接传数字啊,引号不当然啊当字符串来么,
连类型都不用指定

dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView1.Columns[0].CellTemplate.ValueType =typeof(int);
dataGridView1.Rows.Add(8);
dataGridView1.Rows[0].Cells[0].Value = 10;
dataGridView1.Rows[1].Cells[0].Value = 5;
dataGridView1.Rows[2].Cells[0].Value = 112;
dataGridView1.Rows[3].Cells[0].Value = 201;
dataGridView1.Rows[4].Cells[0].Value = 22;
dataGridView1.Rows[5].Cells[0].Value = 320;
dataGridView1.Rows[6].Cells[0].Value = 45;
dataGridView1.Rows[7].Cells[0].Value = 950;
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
yumanqing 2009-04-11
  • 打赏
  • 举报
回复
看的不是很明白,我对winfowm不是很熟悉,不过我用Cloud的方法测试了
dataGridView1.Rows.Add(8);
dataGridView1.Rows[0].Cells[0].Value = "10";
dataGridView1.Rows[1].Cells[0].Value = "5";
dataGridView1.Rows[2].Cells[0].Value = "11278.0";
dataGridView1.Rows[3].Cells[0].Value = "201";
dataGridView1.Rows[4].Cells[0].Value = "22";
dataGridView1.Rows[5].Cells[0].Value = "320";
dataGridView1.Rows[6].Cells[0].Value = "1.45";
dataGridView1.Rows[7].Cells[0].Value = "0.950";
dataGridView1.Sort(new DataGridViewComparer(dataGridView1.Columns[0]));
这个11278.0永远排在第一个,不知道为什么?
zgke 2009-04-11
  • 打赏
  • 举报
回复
public class DataGridViewComparer : IComparer
{
private DataGridViewColumn m_Column;
public DataGridViewComparer(DataGridViewColumn p_Column)
{
m_Column = p_Column;
}
int IComparer.Compare(Object x, Object y)
{
if (m_Column == null) return -1;
decimal _X;
decimal _Y;

bool _XConvert = decimal.TryParse(((DataGridViewRow)x).Cells[m_Column.Name].Value.ToString(), out _X);
bool _YConvert = decimal.TryParse(((DataGridViewRow)y).Cells[m_Column.Name].Value.ToString(), out _Y);
return _X.CompareTo(_Y);
}
}

你应该能看明白把..
yumanqing 2009-04-11
  • 打赏
  • 举报
回复
ilikeff8 的方法排出来的是:10 45 950 320 22 201 好像也不是按大-》小或 小->大的顺序
yumanqing 2009-04-11
  • 打赏
  • 举报
回复
刚才又测试了下 Cloud 的方法,还是有问题,现在我就是想让数字类型的列排序, 个人感觉不是很难把,可是一两天了,怎么还没有搞定
http://p13.freep.cn/p.aspx?u=v20_p13_p_0904111022187615_0.jpg
wartim 2009-04-11
  • 打赏
  • 举报
回复

方法有很多,最好是对数据集排序后再加载到datagridview里比较好
如果要排序现有的数据
dataGridView1.Columns.Clear();
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView1.Columns[0].CellTemplate.ValueType =typeof(int);
dataGridView1.Rows.Add(8);
dataGridView1.Rows[0].Cells[0].Value = "10";
dataGridView1.Rows[1].Cells[0].Value = "5";
dataGridView1.Rows[2].Cells[0].Value = "112";
dataGridView1.Rows[3].Cells[0].Value = "201";
dataGridView1.Rows[4].Cells[0].Value = "22";
dataGridView1.Rows[5].Cells[0].Value = "320";
dataGridView1.Rows[6].Cells[0].Value = "45";
dataGridView1.Rows[7].Cells[0].Value = "950";
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
wartim 2009-04-11
  • 打赏
  • 举报
回复

方法有很多,最好是对数据集排序后再加载到datagridview里比较好
如果要排序现有的数据
dataGridView1.Columns.Clear();
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView1.Columns[0].CellTemplate.ValueType =typeof(int);
dataGridView1.Rows.Add(8);
dataGridView1.Rows[0].Cells[0].Value = "10";
dataGridView1.Rows[1].Cells[0].Value = "5";
dataGridView1.Rows[2].Cells[0].Value = "112";
dataGridView1.Rows[3].Cells[0].Value = "201";
dataGridView1.Rows[4].Cells[0].Value = "22";
dataGridView1.Rows[5].Cells[0].Value = "320";
dataGridView1.Rows[6].Cells[0].Value = "45";
dataGridView1.Rows[7].Cells[0].Value = "950";
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
zgke 2009-04-11
  • 打赏
  • 举报
回复
这样看看.. 你的比较是STRING 需要转换的. 建立一个继承IComparer的类

测试..
dataGridView1.Columns.Add("123", "33");
dataGridView1.Rows.Add(8);
dataGridView1.Rows[0].Cells[0].Value = "10";
dataGridView1.Rows[1].Cells[0].Value = "5";
dataGridView1.Rows[2].Cells[0].Value = "112";
dataGridView1.Rows[3].Cells[0].Value = "201";
dataGridView1.Rows[4].Cells[0].Value = "22";
dataGridView1.Rows[5].Cells[0].Value = "320";
dataGridView1.Rows[6].Cells[0].Value = "45";
dataGridView1.Rows[7].Cells[0].Value = "950";
dataGridView1.Sort(new DataGridViewComparer(dataGridView1.Columns[0]));




public class DataGridViewComparer : IComparer
{
private DataGridViewColumn m_Column;
public DataGridViewComparer(DataGridViewColumn p_Column)
{
m_Column = p_Column;
}
int IComparer.Compare(Object x, Object y)
{
if (m_Column == null) return -1;
int _X;
int _Y;

bool _XConvert = Int32.TryParse(((DataGridViewRow)x).Cells[m_Column.Name].Value.ToString(), out _X);
bool _YConvert = Int32.TryParse(((DataGridViewRow)y).Cells[m_Column.Name].Value.ToString(), out _Y);
return _X.CompareTo(_Y);
}
}
加载更多回复(5)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧