DataGridViewComboBoxCell の値を設定できません。datagridview 列は選択肢/値にバインドされていますが、comboBoxCells の指定された列値で dgv.Rows.Add を試行するか、セルの値を個別に設定しようとすると、「DataGridViewComboBoxCell 値が無効です」というエラーが発生します。それらの列に空白の値を含む行を追加すると、選択肢がコンボに表示されます。
単純なオブジェクト 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";
}
}
フォームに入力します。
private void PopulateForm()
{
if (ndcRecords == null || ndcRecords.Count == 0)
return;
dgvNDC.Rows.Clear();
foreach(NDCRecord record in ndcRecords)
{
AddLine("Del", record.NDCcode, record.UnitQuantity, record.UnitOfMeasurement, record.Type, record.Number);
}
}