从 ENUM 填充 DataGridViewComboBox 列并设置它 - System.FormatException 抛出

Populating a DataGridViewComboBox column from an ENUM and setting it - System.FormatException thrown

我想我是最近遇到这个问题的。我尝试了几种不同的方法(基于本论坛中的其他帖子来创建 Yes/No DataGridViewComboBox 列并使用 ENUM 填充其数据源,并相应地 populating/setting 它。我已经能够获得组合DataGridView每一行的框要根据对应的数据适当设置。

这是我正在使用的 ENUM:

这是我用来填充它的代码:

                            //
                            DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
                            //DataGridViewTextBoxColumn cmb = new DataGridViewTextBoxColumn();

                            cmb.DataPropertyName = "approved";
                            cmb.HeaderText = Get_Header_Text_For(cmb.DataPropertyName);
                            cmb.HeaderCell.Style.BackColor = Color.Green;
                            cmb.HeaderCell.Style.ForeColor = Color.White;
                            cmb.DefaultCellStyle = CStyleCenter;
                            cmb.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                            cmb.Name = approvedCheckCol;
                            cmb.DataSource = new List<AccessNCPCBase.YesNo>((AccessNCPCBase.YesNo[])Enum.GetValues(typeof(AccessNCPCBase.YesNo)))
                                                  .Select(value => new { Display = value.ToString(), Value = (int)value })
                                                  .ToList();
                            cmb.ValueMember = "Value";
                            cmb.DisplayMember = "Display";
                            cmb.Visible = true;
                            cmb.ReadOnly = false;
                            //
                            dgvParm.Columns.Add(cmb);
                            dgvParm.Columns[approvedCheckCol].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;

这是新 DataGridViewComboBoxColumn 的填充(来自 ENUM)数据源的屏幕截图:

当我测试代码时,在 DataGridView 的 DataError 事件中抛出以下异常:

结果如下:

同样,我已经尝试了该线程中建议的几种方法。我什至更改了代码以在填充 DataGridView 之前添加 DataGridViewComboBoxColumn;我的代码最初是在填充 DataGridView 之后添加该列,但之前的一位发帖人提到这解决了他们的问题,所以我尝试了一下,但没有成功。

有人知道我做错了什么或遗漏了什么吗?当然,任何建议 and/or 见解将不胜感激。

克里斯·弗利特伍德 blkwebman@mindspring.com

由于组合框列最适合 classes 而不是 enums 或原始类型,我建议您创建一个 class 专门用作“答案”组合框列中的每个项目。然后你可以使用这个“答案”列表 class 绑定到组合框列。下面是一个简单的例子。

public class Answer {
  public int AnswerValue { get; set; }
  public string AnswerDisplay { get; set; }

  public static List<Answer> GetYesNoList() {
    List<Answer> answers = new List<Answer>();
    answers.Add(new Answer { AnswerValue = 0, AnswerDisplay = "No" });
    answers.Add(new Answer { AnswerValue = 1, AnswerDisplay = "Yes" });
    answers.Add(new Answer { AnswerValue = 2, AnswerDisplay = "NA" });
    return answers;
  }
}

Answer class 有两 (2) 个属性……AnswerValue 是一个 int 值“0/1”和一个伴随的 AnswerDisplaystring “No/Yes”。这些属性将用于组合框 ValueMemberDisplayMember.

接下来,我们创建一个 static 方法,该方法 returns 我们希望列表中的值与数据中的值“匹配”。我们将把它用作组合框列的 DataSource。请注意添加的“NA”条目……这只是关于当您在数据中遇到非 0 或 1 的值时该怎么做的建议。您将无法“忽略”数据中的这些无效值,在这种情况下,如果该值无效,您可以将该值设置为 2 以指示无效值。

接下来要在网格中使用这个,您可以使用下面的代码在网格中设置数据源之前添加列。

private void SetComboCol() {
  DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
  cmb.DataPropertyName = "Approved";
  cmb.HeaderText = "Approved";
  cmb.Name = "approvedCheckCol";
  cmb.DataSource = Answer.GetYesNoList();
  cmb.ValueMember = "AnswerValue";
  cmb.DisplayMember = "AnswerDisplay";
  dgvParm.Columns.Add(cmb);
}

同意这只是一种方法,我相信还有其他方法可以实现。

如前所述,即使在网格中正确设置了这个“已批准”列。检查数据中所有“已批准”值是明智的。如果您在“已批准”列中找到一个不是 0 或 1 的值,则将其设置为 2。这至少可以最大限度地减少抛出网格 DataError