从 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”和一个伴随的 AnswerDisplay
是 string
“No/Yes”。这些属性将用于组合框 ValueMember
和 DisplayMember
.
接下来,我们创建一个 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
。
我想我是最近遇到这个问题的。我尝试了几种不同的方法(基于本论坛中的其他帖子来创建 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”和一个伴随的 AnswerDisplay
是 string
“No/Yes”。这些属性将用于组合框 ValueMember
和 DisplayMember
.
接下来,我们创建一个 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
。