我有一个绑定到列表的DGV。
工作是包含许多属性的类,其中包含一个状态属性,该属性是INT类型。我想在DataGridViewComboxCell中具有该状态值,该值映射到适当的显示值。
,映射看起来像
1 = Completed
2 = In Progress
3 = Errored
4 = On Hold
我试图将DataGridViewComboboxCell绑定到保存状态的INT和字符串值的列表。
我一直无法确定如何获得工作。
public class Work
{
public int id {get; set;}
public string name {get; set;}
public int status {get; set;}
public datetime created {get; set;}
public datetime modified {get; set;}
}
public class Statuses
{
public int id {get; set;}
public string DisplayValue {get; set;}
}
如果可以做到这一点,请告诉我..
评论中建议的一种可能的解决方案是"创建" DataGridViewComboBoxColumn
的描述方式,然后将其添加到网格中。在设置网格数据源之前执行此操作。将此组合框列映射到Work
列表的" WorkStatus"属性,使用组合列DataPropertyName
完成。将DataPropertyName
列设置为" WorkStatus"应该可以解决问题。
您可能会遇到的一个重要问题是,在设置了使用1 - 完整,2 - 正在进行的组合框列之后。int
值1-4是列表中"状态"字段中的值Work
项目…希望!但是,如果Status
字段之一的值不是1、2、3或4…,那么当该值映射到组合框列时,网格将抛出DataError
。在大多数情况下,在读取数据和繁荣崩溃之前,您不会知道这一点。
关键是,如果要设置一个组合框列,然后将一个从数据源到本列的列"映射"列……最好确保它没有任何无效的"状态"值。否则,保证了崩溃(数据错误(。无论如何,谨慎地将DataError
连接起来。
鉴于此,似乎至少必须"检查"以确保当数据绑定到网格时不会发生这种情况。一种简单的解决方案是循环浏览所有数据(将其绑定到网格之前(,并"检查每个Work
项目的"状态"值。未知的是,如果数据大于4或小于1的值,该怎么办。您不能像上面的解释一样放开它。该解决方案是只需将值添加到具有"未知"字符串值的组合框中。这至少将"保证"您避免从无效的值中避免数据错误。
将其放在一起可能会这样……
下面是发布的工作类,但是我确实更改了一些可变名称。这是绑定到网格的类。
public class Work {
public int WorkID { get; set; }
public string WorkName { get; set; }
public int WorkStatus { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
}
接下来是用于定义Status
对象的Status
类。这用于组合框列。与覆盖的Equals
方法一起添加构造函数。这将有助于"检查",以查看使用列表的Contains
属性在列表中是否已经在列表中。
public class Status : IEquatable<Status> {
public int StatusID { get; set; }
public string StatusString { get; set; }
public Status(int statusID, string statusString) {
StatusID = statusID;
StatusString = statusString;
}
public override bool Equals(object obj) {
if (obj.GetType() != GetType()) return false;
return Equals(obj as Status);
}
public bool Equals(Status that) {
return that != null && this.StatusID == that.StatusID;
}
public override int GetHashCode() {
var hashCode = -1280899892;
hashCode = hashCode * -1521134295 + StatusID.GetHashCode();
return hashCode;
}
}
设置ListOfStatus
将需要通过Work
对象的列表进行循环,并"检查"每个状态值,以确保值在1到4(包括4(之间。返回此列表的一种方法可能会派上用场,并且可能看起来像下面……首先,创建了"默认" Status
值并将其添加到列表(1、2、3、4(,然后,通过Work
项目循环到添加状态列表中尚未有的所有值。
private List<Status> GetStatusList(List<Work> workItems) {
List<Status> listOfStatus = new List<Status>();
// add the default values for the combo boxes
Status curStatus = new Status(1, "Complete");
listOfStatus.Add(curStatus);
curStatus = new Status(2, "In Progress");
listOfStatus.Add(curStatus);
curStatus = new Status(3, "Errored");
listOfStatus.Add(curStatus);
curStatus = new Status(4, "On Hold");
listOfStatus.Add(curStatus);
// check to make sure the data (workItems) does NOT have any values in the Status field...
// that are NOT one of the values above... (specifically 1, 2, 3 or 4)
// if the value is NOT one of the values above... we will simply add it to the list
Status unknownStatus;
foreach (Work work in workItems) {
if (work.WorkStatus < 1 || work.WorkStatus > 4) {
unknownStatus = new Status(work.WorkStatus, "Unknown_" + work.WorkStatus);
if (!listOfStatus.Contains(unknownStatus)) {
listOfStatus.Add(unknownStatus);
}
}
}
return listOfStatus;
}
现在,我们有了一个很好的Status
对象列表,我们可以继续创建组合框列,并将此列表用作组合列的数据源。给定Work
对象的列表是我们需要创建此列的全部,并且返回此DataGridViewComboBoxColumn
的方法可能看起来像下面……。首先,我们从上面的方法获取状态列表,然后设置列属性确保设置列DataPropertyName
以匹配Work
对象WorkStatus
属性。如果这不匹配,则列将无法正确映射。添加的"状态"列最终将成为网格中的第一列,因此您可能需要更改其序数值。
private DataGridViewComboBoxColumn GetComboColumn(List<Work> listOfWork) {
List<Status> ListOfStatus = GetStatusList(listOfWork);
DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
comboCol.Name = "Status";
comboCol.DataPropertyName = "WorkStatus";
comboCol.DisplayMember = "StatusString";
comboCol.ValueMember = "StatusID";
comboCol.DataSource = ListOfStatus;
return comboCol;
}
下面使用上述方法的示例如下。
private void Form1_Load(object sender, EventArgs e) {
List<Work> ListOfWork = new List<Work>();
FillListOfWork(ListOfWork);
dataGridView1.Columns.Add(GetComboColumn(ListOfWork));
dataGridView1.DataSource = ListOfWork;
}
private void FillListOfWork(List<Work> ListOfWork) {
Work newWork;
Random rand = new Random();
for (int i = 0; i < 100; i++) {
newWork = new Work();
newWork.WorkID = i;
newWork.WorkName = "Work Name " + i;
newWork.WorkStatus = rand.Next(1, 5);
newWork.DateCreated = DateTime.Now;
newWork.DateModified = DateTime.Now;
ListOfWork.Add(newWork);
}
}
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) {
MessageBox.Show("DataError: " + e.Exception.Message);
}
我希望这会有所帮助。