C# 如何以编程方式设置DataGridViewComboxCell值?
设置DataGridViewComboxCell的值时遇到问题。datagridview列与选项/值绑定,但当我尝试使用comboBoxCells的指定列值添加dgv.Rows.Add或单独设置单元格的值时,它会生成“DataGridViewComboxCell值无效”错误。如果我为这些列添加一个带有空值的行,那么这些选项在组合框中显示得很好 我有一个对话框,它传递了一个简单对象NDCRecord的arraylistC# 如何以编程方式设置DataGridViewComboxCell值?,c#,winforms,C#,Winforms,设置DataGridViewComboxCell的值时遇到问题。datagridview列与选项/值绑定,但当我尝试使用comboBoxCells的指定列值添加dgv.Rows.Add或单独设置单元格的值时,它会生成“DataGridViewComboxCell值无效”错误。如果我为这些列添加一个带有空值的行,那么这些选项在组合框中显示得很好 我有一个对话框,它传递了一个简单对象NDCRecord的arraylist public class NDCRecord {
public class NDCRecord
{
public string NDCcode = "";
public string UnitQuantity = "";
public string UnitOfMeasurement = "";
public string Type = "";
public string Number = "";
}
在该对话框中,以编程方式创建数据网格,然后重新填充
public NationalDrugCodesForm(ref ArrayList ndcRecordsIn)
{
InitializeComponent();
ndcRecords = ndcRecordsIn;
SetupDataGridViewColumns();
PopulateForm();
}
设置:
private void SetupDataGridViewColumns()
{
// -----------------------------------------------------
// Add/Del column
// -----------------------------------------------------
DataGridViewButtonColumn dgvbcAddRemove = new DataGridViewButtonColumn();
dgvbcAddRemove.HeaderText = "Add";
dgvbcAddRemove.Text = "Add";
dgvbcAddRemove.Name = "Add";
DataGridViewCellStyle addButtonStyle = new DataGridViewCellStyle();
addButtonStyle.BackColor = Color.Blue;
addButtonStyle.ForeColor = Color.White;
dgvbcAddRemove.HeaderCell.Style = addButtonStyle;
dgvNDC.Columns.Add(dgvbcAddRemove);
// -----------------------------------------------------
// Additional Columns
// -----------------------------------------------------
dgvNDC.Columns.Add("NDCCode", "NDC Code");
dgvNDC.Columns.Add("UnitQuantity", "Unit Quantity");
DataGridViewComboBoxColumn unitOfMeasurement = new DataGridViewComboBoxColumn();
unitOfMeasurement.HeaderText = "Unit Of Measurement";
unitOfMeasurement.Name = "UnitOfMeasurement";
dgvNDC.Columns.Add(unitOfMeasurement);
DataGridViewComboBoxColumn type = new DataGridViewComboBoxColumn();
type.HeaderText = "Type";
type.Name = "Type";
dgvNDC.Columns.Add(type);
dgvNDC.Columns.Add("Number", "Prescription Number");
AddLine("Del", "", "", "", "", "");
BindUnitOfMeasurement((DataGridViewComboBoxCell)dgvNDC.Rows[0].Cells["UnitOfMeasurement"]);
BindType((DataGridViewComboBoxCell)dgvNDC.Rows[0].Cells["Type"]);
}
AddLine函数:
private void AddLine(string buttonLabel, string ndcCode, string unitQuantity, string unitOfMeasurement, string type, string rxNumber)
{
dgvNDC.Rows.Add(new object[] { buttonLabel, ndcCode, unitQuantity, unitOfMeasurement, type, rxNumber });
}
绑定功能:
private void BindUnitOfMeasurement(DataGridViewComboBoxCell cb)
{
string[] Values = { "F2", "GR", "ME", "ML", "UN" };
string[] Choices = { "F2 - International Unit", "GR - Gram", "ME - Milligram", "ML - Milliliter", "UN - Unit" };
ControlManip.DataBindDDL(cb, Choices, Values);
}
private void BindType(DataGridViewComboBoxCell cb)
{
string[] Values = { "XZ", "VY" };
string[] Choices = { "XZ - Prescription Number", "VY - Link Sequence Number" };
ControlManip.DataBindDDL(cb, Choices, Values);
cb.Value = "XZ";
}
public static void DataBindDDL(ref ComboBox cb, string[] Choices, string[] Values)
{
DataTable dt = new DataTable();
dt.Columns.Add("Choice");
dt.Columns.Add("Value");
if (Choices.Length != Values.Length)
{
throw new Exception("Number of Choices and Values do not match!");
}
else
{
dt.Rows.Add(new object[] { "", "" });
for (int i = 0; i < Choices.Length; i++)
{
if (Choices[i] is object && Values[i] is object)
{
dt.Rows.Add(new object[] { Choices[i], Values[i] });
}
}
cb.DataSource = dt;
cb.DisplayMember = "Choice";
cb.ValueMember = "Value";
}
}
问题是我绑定的是单个单元格,而不是包含下拉框的列。我在单击“添加”按钮的地方插入了绑定方法,使其看起来好像添加了一行空白值仍然会导致填充的下拉列表。但是添加具有指定值的行会导致错误,因为该行的下拉列的集合中还没有任何内容。下面是对代码的重要修改: 在SetupDataGridViewColumns中,而不是
BindUnitOfMeasurement((DataGridViewComboBoxCell)dgvNDC.Rows[0].Cells["UnitOfMeasurement"]);
BindType((DataGridViewComboBoxCell)dgvNDC.Rows[0].Cells["Type"]);
使用
并适当修改绑定方法。然后,您可以为组合添加一个具有空值或指定值的行,该行将正常工作(在其中一个行下面,为默认值指定了一个值,另一个为空,供用户选择)
此外,我不确定这是否必要,但在实验过程中,我还为每个组合框列添加了以下内容:
type.ValueType = typeof (string);
为了简化。。。我设置了一个带有组合框列的datagrid,并将这些列绑定到数据源。当为这些列添加带有空白值的行时,一切看起来都很好;组合有他们应该做的选择。如果我尝试添加具有指定值的行,并且它们是组合框值的有效选项,则会出现错误。在调试过程中,我注意到该单元没有“项”,这似乎是一个问题。。。但我不明白,因为在未设置值时选项就在那里。请注意,ValueMember和DisplayMember是在绑定方法的单元格上设置的。我在列上设置了ValueMember、DisplayMember和DataPropertyName。。。但仍然得到同样的结果。
BindUnitOfMeasurement((DataGridViewComboBoxColumn)dgvNDC.Columns["UnitOfMeasurement"]);
BindType((DataGridViewComboBoxColumn)dgvNDC.Columns["Type"]);
AddLine("Del", "", "", "", "XZ", "");
type.ValueType = typeof (string);