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

时间:2008-12-02 20:14:47

标签: c# vb.net winforms

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

如何让列对文本描述进行排序而不是数字ID?

我没有看到一种方法来覆盖列,以按FormattedValue而不是Value进行排序。我可以确保说明在我的数据表中显示为单独的列,但我没有看到任何方式说“将列VALUE_ID用作DataMember但将VALUE_DESCRIPITON列用作'SortMember'”

2 个答案:

答案 0 :(得分:2)

您可以使用以下文章Column Sort Modes

中描述的技术
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();
}

答案 1 :(得分:1)

您使用什么作为数据源?一个DataTable?排序通常由列表本身提供,因此您实际上可以编写具有您自己的特定排序行为的自定义列表。最简单的方法(虽然仍然不重要)是继承BindingList<T>,并覆盖ApplySortCoreRemoveSortCoreSupportsSortingCoreIsSortedCore,{{1 }和SortPropertyCore(p!)。特别是,SortDirectionCore必须检测特定的ApplySortCore,然后执行定制搜索。

我并不是说这是微不足道的(恰恰相反) - 但它可以在标准的绑定机制中完成。

另一个想法可能是使id成为别的东西,实际上不是int,而是自定义类/结构。它需要实现PropertyDescriptor / IComparable,并有一个显示所需文本的IComparable<T>。然后你可能(未经测试)直接绑定到该列。

然而!!!如果您还不熟悉ToString(),我会建议避免这种复杂性。如果以上是有道理的,那么很好 - 如果没有,我不确定我会尝试你第一次刺入那个区域......