我正在尝试编写一个可用于我的应用程序的SortableBindingList.我发现了很多关于如何实现基本排序支持的讨论,以便BindingList在DataGridView或其他绑定控件的上下文中使用时进行排序,包括来自StackOverflow的这篇文章:
DataGridView排序和例如.NET中的BindingList <T>
这一切都非常有用,我已经实现了代码,经过测试等等,并且一切正常,但在我的特殊情况下,我需要能够支持对Sort()的简单调用,并让该调用使用默认的IComparable. CompareTo()进行排序,而不是调用ApplySortCore(PropertyDescriptor,ListSortDirection).
原因是因为我有很多代码依赖于Sort()调用,因为这个特定的类最初是从List继承的,最近被改为BindingList.
具体来说,我有一个名为VariableCode的类和一个名为VariableCodeList的集合类.VariableCode实现IComparable,其中的逻辑基于几个属性等适度复杂...
public class VariableCode : ... IComparable ...
{
public int CompareTo(object p_Target)
{
int output = 0;
//some interesting stuff here
return output;
}
}
public class VariableCodeList : SortableBindingList<VariableCode>
{
public void Sort()
{
//This is where I need help
// How do I sort this list using the IComparable
// logic from the class above?
}
}
Run Code Online (Sandbox Code Playgroud)
我在Sort()中重新调整了ApplySortCore方法的尝试失败了,但是阻止我的是,ApplySortCore期望PropertyDescriptor进行排序,我无法弄清楚如何使用IComparable .CompareTo()逻辑.
有人能指出我正确的方向吗?
非常感谢.
编辑:这是基于Marc的回复的最终代码,供将来参考.
/// <summary>
/// Sorts using the default IComparer of …Run Code Online (Sandbox Code Playgroud) 我以编程方式将列添加到DataGridView,然后绑定到列表.默认情况下,列的SortMode是自动的.但是,当我运行我的应用程序时,单击标题无效.向上/向下箭头未显示.从阅读MSDN,关于自动排序的说法并不多.他们详细介绍了程序化排序.所以,我假设自动方式应该很容易.MSDN继续说" 除非使用列标题进行选择,否则单击列标题会自动按此列对DataGridView进行排序,并显示一个指示排序顺序的字形." 这到底是什么意思呢?我可以设置与排序冲突的网格属性吗?我错过了什么?
AutoGenerateColumns = false;
AllowUserToAddRows = false;
AllowUserToDeleteRows = false;
AllowUserToResizeRows = false;
AllowUserToResizeColumns = false;
ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
ReadOnly = true;
MultiSelect = false;
RowHeadersVisible = false;
SelectionMode = DataGridViewSelectionMode.FullRowSelect;
CellBorderStyle = DataGridViewCellBorderStyle.None;
DataGridViewTextBoxColumn idColumn = new DataGridViewTextBoxColumn();
idColumn.HeaderText = "ID";
idColumn.DataPropertyName = "IDNumber";
DataGridViewTextBoxColumn nameColumn = new DataGridViewTextBoxColumn();
nameColumn.HeaderText = "Name";
nameColumn.DataPropertyName = "Description";
DataGridViewTextBoxColumn lastModifiedColumn = new DataGridViewTextBoxColumn();
lastModifiedColumn.HeaderText = "Last Modified";
lastModifiedColumn.DataPropertyName = "Date";
Columns.Add(idColumn);
Columns.Add(nameColumn);
Columns.Add(lastModifiedColumn);
List<IMyObject> bindingList = GetMyList(); …Run Code Online (Sandbox Code Playgroud) 因此,我一直在遵循Windows 窗体控件上的数据绑定指南(MAD 支持作者,该指南很棒),并且我使用它来创建自定义类并将 a 绑定DataGridView到此类的集合:
class CompleteJobListEntry
{
private string _jobName;
private Image _jobStatus;
private DateTime _jobAddedDate;
private string _jobAddedScanner;
private string _jobAddedUser;
private string _jobLastActivity;
private DateTime _jobActivityDate;
private string _jobActivityUser;
public string JobName { get { return _jobName; } set { this._jobName = value; } }
public Image JobStatus { get { return _jobStatus; } set { this._jobStatus = value; } }
public DateTime JobAddedDate { get { return _jobAddedDate; } set { this._jobAddedDate …Run Code Online (Sandbox Code Playgroud) 我相信这应该自动处理.我绑定DataGridView到一个对象数组:
public class Entity {
public string Name { get; set; }
public int PrimaryKey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
绑定网格:
public void BindGrid(Entity[] entities) {
grdEntities.DataSource = entities;
}
Run Code Online (Sandbox Code Playgroud)
当我单击"名称"列中的列标题时,即使将SortMode其设置为"自动",也不会发生任何事情.列标题中也缺少排序字形.
我试过绑定到一个IBindingList也是一个,IList但这没有用.
我希望有一个简单,优雅的解决方案,可以在DataGridView或者设置属性,DataGridViewColumn而不是必须创建一个新类来支持排序.通过单击DataBound上的标题,我应该怎么做才能支持对列进行排序DataGridView?