Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView自定义排序不在DataMember上(数据绑定网格)_C#_Vb.net_Winforms - Fatal编程技术网

C# DataGridView自定义排序不在DataMember上(数据绑定网格)

C# DataGridView自定义排序不在DataMember上(数据绑定网格),c#,vb.net,winforms,C#,Vb.net,Winforms,我有一个自定义DataGridView列,它使用一个嵌入式控件,弹出一个搜索窗口来搜索该列的值。重要的是,数据绑定列是一个数字ID,但自定义列单元格显示一个文本描述 如何让列按文本描述而不是数字ID排序 我看不到一种方法可以重写列,以按FormattedValue而不是Value进行排序。我可以确保描述在我的数据表中显示为一个单独的列,但我看不到任何方式可以说“使用列值\u ID作为DataMember,但使用列值\u描述为'SortMember'”您使用什么作为数据源?一个数据表?排序通常由列

我有一个自定义DataGridView列,它使用一个嵌入式控件,弹出一个搜索窗口来搜索该列的值。重要的是,数据绑定列是一个数字ID,但自定义列单元格显示一个文本描述

如何让列按文本描述而不是数字ID排序


我看不到一种方法可以重写列,以按FormattedValue而不是Value进行排序。我可以确保描述在我的数据表中显示为一个单独的列,但我看不到任何方式可以说“使用列值\u ID作为DataMember,但使用列值\u描述为'SortMember'”

您使用什么作为数据源?一个
数据表
?排序通常由列表本身提供,因此您可以使用自己的特定排序行为编写自定义列表。最简单的方法(尽管仍然很简单)是从
BindingList
继承,并重写
ApplySortCore
RemoveSortCore
SupportsSortingCore
IsSortedCore
SortPropertyCore
SortDirectionCore
(呸!)。特别是,
ApplySortCore
必须检测特定的
PropertyDescriptor
,并执行定制搜索

我并不是说它很琐碎(恰恰相反),但它可以在标准绑定机制中完成

另一种方法可能是将id设置为其他类型,实际上不是int,而是自定义类/结构。它需要实现
IComparable
/
IComparable
,并具有显示所需文本的
ToString()
。然后您可以(未经测试)直接绑定到该列


然而!!!如果您还不熟悉
System.ComponentModel
,我建议您避免这种复杂性。如果上述内容有意义,那么很好-如果没有,我不确定我是否会尝试将其作为您在该领域的第一次尝试…

您使用的数据源是什么?一个
数据表
?排序通常由列表本身提供,因此您可以使用自己的特定排序行为编写自定义列表。最简单的方法(尽管仍然很简单)是从
BindingList
继承,并重写
ApplySortCore
RemoveSortCore
SupportsSortingCore
IsSortedCore
SortPropertyCore
SortDirectionCore
(呸!)。特别是,
ApplySortCore
必须检测特定的
PropertyDescriptor
,并执行定制搜索

我并不是说它很琐碎(恰恰相反),但它可以在标准绑定机制中完成

另一种方法可能是将id设置为其他类型,实际上不是int,而是自定义类/结构。它需要实现
IComparable
/
IComparable
,并具有显示所需文本的
ToString()
。然后您可以(未经测试)直接绑定到该列


然而!!!如果您还不熟悉
System.ComponentModel
,我建议您避免这种复杂性。如果上述内容有意义,那么很好-如果没有,我不确定我是否会尝试将其作为您在该领域的第一次尝试…

您可以使用以下文章中描述的技术

private bool递增;
私有内部分类列;
private void dgv_ColumnHeaderMouseClick(对象发送者,DataGridViewCellMouseEventArgs e)
{
List=(List)someBindingSource.DataSource;
如果(e.ColumnIndex!=sortColumn)升序=false;
int 1=e.ColumnIndex;
if(i==DescriptionColumn.Index)
排序(新的比较((x,y)=>x.ID.CompareTo(y.ID));
sortColumn=e.ColumnIndex;
升序=!升序;
如果(!升序)list.Reverse():
someBindingSource.ResetBindings(false);
//您可能还必须调用dgv.Invalidate();
}

您可以使用以下文章中描述的技术

private bool递增;
私有内部分类列;
private void dgv_ColumnHeaderMouseClick(对象发送者,DataGridViewCellMouseEventArgs e)
{
List=(List)someBindingSource.DataSource;
如果(e.ColumnIndex!=sortColumn)升序=false;
int 1=e.ColumnIndex;
if(i==DescriptionColumn.Index)
排序(新的比较((x,y)=>x.ID.CompareTo(y.ID));
sortColumn=e.ColumnIndex;
升序=!升序;
如果(!升序)list.Reverse():
someBindingSource.ResetBindings(false);
//您可能还必须调用dgv.Invalidate();
}

绝对不是小事!但似乎没有任何更快的方法可以做到这一点。绝对不是微不足道的!但似乎没有任何更快的方法可以做到这一点。数据表似乎无法强制转换为列表,虽然我可以直接在绑定源上设置排序,但我必须尝试一下。数据表似乎无法强制转换为列表,尽管我可以直接在绑定源上设置排序重点——我得试试。
private bool ascending;
private int sortColumn;
private void dgv_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    List<SomeObject> list = (List<SomeObject>)someBindingSource.DataSource;
    if (e.ColumnIndex != sortColumn) ascending = false;

    int 1 = e.ColumnIndex;
    if (i == DescriptionColumn.Index)
        list.Sort(new Comparison<SomeObject>((x,y) => x.ID.CompareTo(y.ID)));

    sortColumn = e.ColumnIndex;
    ascending = !ascending;
    if (!ascending) list.Reverse():

    someBindingSource.ResetBindings(false);
    // you may also have to call dgv.Invalidate();
}