今天使用DataGridView 进行排序时遇到个问题
排序数据字段时,当其值有null值时就会出现错误, 在字符串字段中如果第一条数据为null值,而后如果有空值 也会出现错误。 说白了就是类型冲突然。 怎么处理这类的问题?有什么简单的办法?因为针对的不是一个表最好是能通过类方法解决。
以下是跟据网上的一些做法。但不是很满 意,以下只实现了数字的,在字符串中亦会出现这问题。
求解。
Axdgv_DataView.Columns[6].SortMode = DataGridViewColumnSortMode.Programmatic;
private void Axdgv_DataView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{ if (e.ColumnIndex == 5 || e.ColumnIndex == 6 || e.ColumnIndex == 7 || e.ColumnIndex == 8)
{
if (Axdgv_DataView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection == System.Windows.Forms.SortOrder.Ascending)
{
Axdgv_DataView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Descending;
Axdgv_DataView.Sort(new DataGridViewComparer(Axdgv_DataView.Columns[e.ColumnIndex]));
}
else
{
Axdgv_DataView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Ascending;
Axdgv_DataView.Sort(new DataGridViewComparer(Axdgv_DataView.Columns[e.ColumnIndex]));
}
} } 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 == System.Windows.Forms.SortOrder.Descending) return _CompareValue * -1; return _CompareValue;
}
}
排序数据字段时,当其值有null值时就会出现错误, 在字符串字段中如果第一条数据为null值,而后如果有空值 也会出现错误。 说白了就是类型冲突然。 怎么处理这类的问题?有什么简单的办法?因为针对的不是一个表最好是能通过类方法解决。
以下是跟据网上的一些做法。但不是很满 意,以下只实现了数字的,在字符串中亦会出现这问题。
求解。
Axdgv_DataView.Columns[6].SortMode = DataGridViewColumnSortMode.Programmatic;
private void Axdgv_DataView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{ if (e.ColumnIndex == 5 || e.ColumnIndex == 6 || e.ColumnIndex == 7 || e.ColumnIndex == 8)
{
if (Axdgv_DataView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection == System.Windows.Forms.SortOrder.Ascending)
{
Axdgv_DataView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Descending;
Axdgv_DataView.Sort(new DataGridViewComparer(Axdgv_DataView.Columns[e.ColumnIndex]));
}
else
{
Axdgv_DataView.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Ascending;
Axdgv_DataView.Sort(new DataGridViewComparer(Axdgv_DataView.Columns[e.ColumnIndex]));
}
} } 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 == System.Windows.Forms.SortOrder.Descending) return _CompareValue * -1; return _CompareValue;
}
}
Cells[m_Column.Name].Value,你要判断是否为null,如果是,要自己处理一下
不是很理解,我从数据库中读取到数据,添加至datagridview.在datagridview中是做了排序处理的。然后点击排序错误。你是说我在读取出来时对数据做处理吗?我想过在Sql中把null值去掉,但这要改很多语句,在多人开发时容易出现错误而不易被发现。
return;