Datagridview解决列中间有空值时的排序出错问题

Datagridview解决列中间有空值时的排序出错问题

在Winform、.Net开发中,DataGridView是最常用到的一个控件,特别是在对数据库编程中,常用来显示各种数据集信息,所以对Datagridview使用就显得格外重要。

  • DataGridView本身自带排序功能

  • 当字段中含有空值时,利用DataGridView的自动排序功能会报错及解决办法


DataGridView本身自带排序功能

  • DataGridView本身自带排序功能。DataGridView默认可以对数值类型或者字符串类型的字段自动排序。例如,如果DataGridView中分别有一个显示字符串的列和显示数字的列,那么当你在点击字符串列的时候,默认按照字符串的排序规则排序;而当你点击数字列的时候,默认则按照数字的排序规则来排序.。DataGridView本身就支持这个,你不用做任何编码。
    • 如果不想启用DataGridView的自动排序功能,那么可以把DataGridView中的自动排序功能禁用掉。this.dataGridView1.Columns[ "Column1 "].SortMode =DataGridViewColumnSortMode.NotSortable;只针对Column1这1列禁用掉漆自动排序功能;
    • 当然,如果想禁用掉DataGridView中所有的列的自动排序功能,那么只需要写一个循环全部禁用即可。
      for (int i = 0; i < dataGridView1.Columns.Count; i++)
      {
      dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
      }

当DataGridView字段中含有空值时,利用DataGridView的自动排序功能会报错,导致程序抛出异常不能继续运行。

  • 解决办法:
    • 方法一:处理控件。
      在.NET2.0里,为我们提供了一个SortCompare事件,这个事件是在发生排序时触发,它就是我们将要用来解决这个问题的关键。这篇博客中给出了VB.Net下的解决方案,我试了一下,还是报错。Datagridview学习心得之一处理列中间有空值时的排序
      最中看了微软的官方网站,发现SortCompare事件写的有点问题。

具体代码如下(C#)


private void dgvTable_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
        {
            if (e.CellValue1.ToString().Length == 0 && e.CellValue2.ToString().Length == 0)
            {
                e.SortResult = 0;
                // e.Handled = true;就是把默认的给屏蔽掉了
                e.Handled = true;
            }
            else if (e.CellValue1.ToString().Length == 0)
            {
                e.SortResult = -1;
                e.Handled = true;

            }
            else if (e.CellValue2.ToString().Length == 0)
            {
                e.SortResult = 1;
                e.Handled = true;

            }
            else
            {
                //e.Handled = false;则采用datagridview默认的排序方式下面的这行代码和e.Handled=false等效。
                //e.SortResult = string.Compare(e.CellValue1.ToString(), e.CellValue2.ToString());
                e.Handled = false;
            }
        }

其中,e.Handled = true;就是把DataGridView的默认排序方式给禁用了。也就是在设置e.SortResult = -1;的同时也要把DataGridView的默认排序给禁用掉了。

你可能感兴趣的:(winform)