我正在设置我的DataGridView,如下所示:
jobs = new List(); uxJobList.AutoGenerateColumns = false; jobListBindingSource.DataSource = jobs; uxJobList.DataSource = jobListBindingSource; int newColumn; newColumn = uxJobList.Columns.Add("Id", "Job No."); uxJobList.Columns[newColumn].DataPropertyName = "Id"; uxJobList.Columns[newColumn].DefaultCellStyle.Format = Global.JobIdFormat; uxJobList.Columns[newColumn].DefaultCellStyle.Font = new Font(uxJobList.DefaultCellStyle.Font, FontStyle.Bold); uxJobList.Columns[newColumn].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; uxJobList.Columns[newColumn].Width = 62; uxJobList.Columns[newColumn].Resizable = DataGridViewTriState.False; uxJobList.Columns[newColumn].SortMode = DataGridViewColumnSortMode.Automatic; : :
DisplayJob类的外观如下:
public class DisplayJob { public DisplayJob(int id) { Id = id; } public DisplayJob(JobEntity job) { Id = job.Id; Type = job.JobTypeDescription; CreatedAt = job.CreatedAt; StartedAt = job.StartedAt; ExternalStatus = job.ExternalStatus; FriendlyExternalStatus = job.FriendlyExternalStatus; ExternalStatusFriendly = job.ExternalStatusFriendly; CustomerName = job.Customer.Name; CustomerKey = job.Customer.CustomerKey; WorkAddress = job.WorkAddress; CreatedBy = job.CreatedBy; CancelledAt = job.CancelledAt; ClosedAt = job.ClosedAt; ReasonWaiting = job.ReasonWaiting; CancelledBy = job.CancelledBy; CancelledReason = job.CancelledReason; DisplayCreator = Global.GetDisplayName(CreatedBy); ActionRedoNeeded = job.ActionRedoNeeded; if (job.Scheme != null) { SchemeCode = job.Scheme.Code; } } public int Id { get; private set; } public string Type { get; private set; } public DateTime CreatedAt { get; private set; } public DateTime? StartedAt { get; private set; } public string ExternalStatus { get; private set; } public string FriendlyExternalStatus { get; private set; } public string ExternalStatusFriendly { get; private set; } public string CustomerName { get; private set; } public string CustomerKey { get; private set; } public string WorkAddress { get; private set; } public string CreatedBy { get; private set; } public DateTime? CancelledAt { get; private set; } public DateTime? ClosedAt { get; private set; } public string CancelledBy { get; private set; } public string ReasonWaiting { get; private set; } public string DisplayCreator { get; private set; } public string CancelledReason { get; private set; } public string SchemeCode { get; private set; } public bool ActionRedoNeeded { get; private set; } }
但是列排序不起作用.让这个工作的最佳方法是什么?
如果要支持对集合进行排序和搜索,只需从BindingList参数化类型派生类,并覆盖一些基类方法和属性.
最好的方法是扩展BindingList并执行以下操作:
protected override bool SupportsSearchingCore { get { return true; } } protected override bool SupportsSortingCore { get { return true; } }
您还需要实现排序代码:
ListSortDirection sortDirectionValue; PropertyDescriptor sortPropertyValue; protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) { sortedList = new ArrayList(); // Check to see if the property type we are sorting by implements // the IComparable interface. Type interfaceType = prop.PropertyType.GetInterface("IComparable"); if (interfaceType != null) { // If so, set the SortPropertyValue and SortDirectionValue. sortPropertyValue = prop; sortDirectionValue = direction; unsortedItems = new ArrayList(this.Count); // Loop through each item, adding it the the sortedItems ArrayList. foreach (Object item in this.Items) { sortedList.Add(prop.GetValue(item)); unsortedItems.Add(item); } // Call Sort on the ArrayList. sortedList.Sort(); T temp; // Check the sort direction and then copy the sorted items // back into the list. if (direction == ListSortDirection.Descending) sortedList.Reverse(); for (int i = 0; i < this.Count; i++) { int position = Find(prop.Name, sortedList[i]); if (position != i) { temp = this[i]; this[i] = this[position]; this[position] = temp; } } isSortedValue = true; // Raise the ListChanged event so bound controls refresh their // values. OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } else // If the property type does not implement IComparable, let the user // know. throw new NotSupportedException("Cannot sort by " + prop.Name + ". This" + prop.PropertyType.ToString() + " does not implement IComparable"); }
如果您需要更多信息,可以随时访问并获取有关如何扩展绑定列表的所有说明.
Daok的解决方案是正确的.它的工作量往往超过它的价值.
懒人获得所需功能的方法是从业务对象创建并填充DataTable,并将DataGridView绑定到该对象.
这种方法有很多用例无法处理(比如编辑),显然浪费了时间和空间.正如我所说,这是懒惰的.
但它写起来很容易,而且结果代码看起来比实现的更神秘IBindingList
.
此外,您至少已经编写了很多代码,或者至少编写了类似的代码:您编写的用于定义DataTable的代码使您无需编写代码来创建DataGridView的列,因为DataGridView将构造其列绑定时关闭DataTable.