绑定的DataGridView设置了DGVCombocell绑定到另一个来源的显示值



我有一个绑定到列表的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);
}

我希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新