我有一个自定义DataGridView列,它使用一个嵌入式控件,弹出一个搜索窗口以获取该列的值。重要的是数据绑定列是数字ID,但自定义列单元格显示文本描述。
如何让列对文本描述进行排序而不是数字ID?
我没有看到一种方法来覆盖列,以按FormattedValue而不是Value进行排序。我可以确保说明在我的数据表中显示为单独的列,但我没有看到任何方式说“将列VALUE_ID用作DataMember但将VALUE_DESCRIPITON列用作'SortMember'”
答案 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>
,并覆盖ApplySortCore
,RemoveSortCore
,SupportsSortingCore
,IsSortedCore
,{{1 }和SortPropertyCore
(p!)。特别是,SortDirectionCore
必须检测特定的ApplySortCore
,然后执行定制搜索。
我并不是说这是微不足道的(恰恰相反) - 但它可以在标准的绑定机制中完成。
另一个想法可能是使id成为别的东西,实际上不是int,而是自定义类/结构。它需要实现PropertyDescriptor
/ IComparable
,并有一个显示所需文本的IComparable<T>
。然后你可能(未经测试)直接绑定到该列。
然而!!!如果您还不熟悉ToString()
,我会建议避免这种复杂性。如果以上是有道理的,那么很好 - 如果没有,我不确定我会尝试你第一次刺入那个区域......