您的位置:程序门 -> .net技术 -> c#



datagridview的排序该如何写?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


datagridview的排序该如何写?[已结贴,结贴人:stxuhui]
发表于:2007-09-18 11:50:26 楼主
我的datagridview榜定了一些数据,但不是用dataset绑定,绑定后无法自动排序,上网查了下发现要写sortcompare,具体该如何写呢?
发表于:2007-09-18 12:27:441楼 得分:15
datagridview   列有三种排序模式。每一列的排序模式是通过该列的   sortmode   属性指定的,该属性可以设置为以下的   datagridviewcolumnsortmode   枚举值之一。

datagridviewcolumnsortmode   值     说明    
automatic  
  文本框列的默认排序模式。除非将列标头用于选择,否则单击列标头将自动按此列对   datagridview   排序,并显示一个指示排序顺序的标志符号。
 
notsortable  
  非文本框列的默认排序模式。可以以编程方式对此列排序;但此列不适合排序,因此未为排序标志符号保留空间。  
 
programmatic  
  可以以编程方式对此列排序;而且为排序标志符号保留了空间。
 

如果默认为   notsortable   的列包含的值可以有意义地排序,您可能希望更改该列的排序模式。例如,如果有一个数据库列包含表示项状态的数字,则可以通过将一个图像列绑定到该数据库列来将这些数字显示为相应的图标。然后可以在   system.windows.forms.datagridview.cellformatting   事件的处理程序中,将数值单元格值更改为图像显示值。在这种情况下,将   sortmode   属性设置为   automatic   会使用户能够对该列排序。自动排序将使用户能够对具有相同状态的项分组,即使这些对应于数字的状态没有自然的顺序。复选框列也是自动排序对于将处于相同状态的项分组很有用的示例。

可以以编程方式按任一列或多列中的值对   datagridview   排序,而不论   sortmode   设置如何。当希望为排序提供自己的用户界面   (ui)   时,或者当希望实现自定义排序时,以编程方式排序很有用。提供自己的排序用户界面非常有用,例如,在设置   datagridview   选择模式以启用列标头选择时。在这种情况下,虽然列标头不能用于排序,但是仍希望标头显示相应的排序标志符号,因此将   sortmode   属性设置为   programmatic。

设置为编程排序模式的列不会自动显示排序标志符号。对于这些列,必须通过设置   system.windows.forms.datagridviewcolumnheadercell.sortglyphdirection   属性来手动显示标志符号。为了在自定义排序中能够灵活操作,这是必需的。例如,如果按多列对   datagridview   排序,则可能希望显示多个排序标志符号或不显示任何标志符号。

虽然可以以编程方式按任一列对   datagridview   排序,但是一些列(如按钮列)可能不包含可以有意义地排序的值。对于这些列,notsortable   的   sortmode   属性设置指示将永不使用这些列排序,因此不需要在标头中为标志符号保留空间。

对于已排序的   datagridview,可以通过检查   sortedcolumn   和   sortorder   属性的值确定排序列和排序顺序。这些值在自定义排序操作之后没有意义。有关自定义排序的更多信息,请参见本主题后面的“自定义排序”部分。

对包含绑定列和未绑定列的   datagridview   控件排序时,未绑定列中的值无法自动维护。若要维护这些值,必须通过将   virtualmode   属性设置为   true   和处理   cellvalueneeded   和   cellvaluepushed   事件实现虚拟模式。有关更多信息,请参见如何:在   windows   窗体   datagridview   控件中实现虚拟模式。在绑定模式下按未绑定列进行排序不受支持。

以编程方式进行排序
可以通过调用   datagridview   的   sort   方法以编程方式对其排序。  

sort   方法的   sort(datagridviewcolumn,listsortdirection)   重载采用   datagridviewcolumn   和   listsortdirection   枚举值作为参数。当按列值可以有意义地排序(但不想将该列配置为用于自动排序)的列排序时,此重载很有用。当调用此重载并传入具有   system.windows.forms.datagridviewcolumnsortmode.automatic   的   sortmode   属性值的列时,会自动设置   sortedcolumn   和   sortorder   属性并在列标头中显示相应的排序标志符号。  

注意  
当通过设置   datasource   属性将   datagridview   控件绑定到外部数据源时,sort(datagridviewcolumn,listsortdirection)   方法重载不能用于未绑定列。此外,当   virtualmode   属性为   true   时,可以仅为绑定列调用此重载。若要确定某一列是否为数据绑定列,请检查   isdatabound   属性值。在绑定模式下对未绑定列排序不受支持。
 

自定义排序
可以通过使用   sort   方法的   sort(icomparer)   重载或通过处理   sortcompare   事件来自定义   datagridview。

sort(icomparer)   方法重载采用一个实现   icomparer   接口的类的一个实例作为参数。当希望提供自定义排序时,此重载很有用;例如,当某一列中的值没有自然排序顺序时,或者当自然排序顺序不适用时。在这种情况下,不能使用自动排序,但是可能仍然希望用户通过单击列标头进行排序。可以在   columnheadermouseclick   事件的处理程序中调用此重载,即使不使用列标头进行选择。  

注意  
仅当   datagridview   控件未绑定到外部数据源且   virtualmode   属性值为   false   时,sort(icomparer)   方法重载才起作用。若要为绑定到外部数据源的列自定义排序,必须使用由该数据源提供的排序操作。在虚拟模式中,必须为未绑定列提供您自己的排序操作。
 

若要使用   sort(icomparer)   方法重载,必须创建您自己的类,该类实现   icomparer   接口。此接口要求您的类实现   system.collections.icomparer.compare(system.object,system.object)   方法,在调用   sort(icomparer)   方法重载时,datagridview   将   datagridviewrow   对象作为输入传给该方法。使用此方法,您可以基于任一列中的值计算正确的行排序。

sort(icomparer)   方法重载不设置   sortedcolumn   和   sortorder   属性,因此必须总是设置   system.windows.forms.datagridviewcolumnheadercell.sortglyphdirection   属性以显示排序标志符号。  

作为   sort(icomparer)   方法重载的一个替代方法,可以通过为   sortcompare   事件实现处理程序来提供自定义排序。当用户单击为自动排序配置的列的标头时,或者当调用   sort   方法的   sort(datagridviewcolumn,listsortdirection)   重载时,将发生此事件。对控件中的每对行均发生该事件,这使您能够计算它们的正确顺序。  

注意  
当   datasource   属性已设置时,或者当   virtualmode   属性值为   true   时,不会发生   sortcompare   事件。
 
发表于:2007-09-18 13:03:062楼 得分:0
看过了,不知道要怎么写
发表于:2007-09-18 14:45:113楼 得分:15
private   void   datagridview1_sortcompare(object   sender,   datagridviewsortcompareeventargs   e)
                {
                        //e.cellvalue1
                        //e.cellvalue2
                        //这两个是object,根据实际情况进行类型转换,再比较,结果赋给e.sortresult。
                        //e.sortresult的值的含义,可以查一下msdn。

                        if   ((int)e.cellvalue1   <   (int)e.cellvalue2)
                        {
                                e.sortresult   =   -1;
                        }
                        else   if   ((int)e.cellvalue1   ==   (int)e.cellvalue2)
                        {
                                e.sortresult   =   0;
                        }
                        else
                        {
                                e.sortresult   =   1;
                        }
                        e.handled   =   true;
                       
                }
发表于:2007-11-06 12:00:204楼 得分:0
using   system;
using   system.collections;
using   system.collections.generic;
using   system.text;
using   system.windows.forms;

namespace   commonlib
{
        public   class   datagridviewcolumnsorter   :   icomparer
        {
                ///   <summary>
                ///   指定按照哪个列排序
                ///   </summary>
                private   int   columntosort;
                ///   <summary>
                ///   指定排序的方式
                ///   </summary>
                private   sortorder   orderofsort;
                ///   <summary>
                ///   声明caseinsensitivecomparer类对象,
                ///   参见ms-help://ms.vscc.2003/ms.msdnqtr.2003feb.2052/cpref/html/frlrfsystemcollectionscaseinsensitivecomparerclasstopic.htm
                ///   </summary>
                private   caseinsensitivecomparer   objectcompare;

                ///   <summary>
                ///   构造函数
                ///   </summary>
                public   datagridviewcolumnsorter()
                {
                        //   默认按第一列排序
                        columntosort   =   0;

                        //   排序方式为不排序
                        orderofsort   =   sortorder.none;

                        //   初始化caseinsensitivecomparer类对象
                        objectcompare   =   new   caseinsensitivecomparer();
                }

                ///   <summary>
                ///   重写icomparer接口.
                ///   </summary>
                ///   <param   name="x"> 要比较的第一个对象 </param>
                ///   <param   name="y"> 要比较的第二个对象 </param>
                ///   <returns> 比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1 </returns>
                public   int   compare(object   x,   object   y)
                {
                        int   compareresult;
                        datagridviewrow   datagridviewrowx,   datagridviewrowy;

                        //   将比较对象转换为datagridviewrow对象
                        datagridviewrowx   =   (datagridviewrow)x;
                        datagridviewrowy   =   (datagridviewrow)y;

                        //   比较
                        compareresult   =   objectcompare.compare(datagridviewrowx.cells[columntosort].tag,   datagridviewrowy.cells[columntosort].tag);

                        //   根据上面的比较结果返回正确的比较结果
                        if   (orderofsort   ==   sortorder.ascending)
                        {
                                //   因为是正序排序,所以直接返回结果
                                return   compareresult;
                        }
                        else   if   (orderofsort   ==   sortorder.descending)
                        {
                                //   如果是反序排序,所以要取负值再返回
                                return   (-compareresult);
                        }
                        else
                        {
                                //   如果相等返回0
                                return   0;
                        }
                }

                ///   <summary>
                ///   获取或设置按照哪一列排序.
                ///   </summary>
                public   int   sortcolumn
                {
                        set
                        {
                                columntosort   =   value;
                        }
                        get
                        {
                                return   columntosort;
                        }
                }

                ///   <summary>
                ///   获取或设置排序方式.
                ///   </summary>
                public   sortorder   order
                {
                        set
                        {
                                orderofsort   =   value;
                        }
                        get
                        {
                                return   orderofsort;
                        }
                }

        }

}


快速检索

最新资讯
热门点击