4

我在设置 DataGridViewComboBoxCell 的值时遇到问题。datagridview 列与选择/值绑定,但是当我尝试 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);
        }
    }
4

1 回答 1

0

问题是我绑定的是单个单元格而不是包含下拉框的列。我插入了绑定方法,其中单击“添加”按钮使其看起来好像添加了一行空白值仍然会导致填充下拉列表。但是添加具有指定值的行会导致错误,因为该行的下拉列在其集合中还没有任何内容。所以这里是对代码的重要修改:

在 SetupDataGridViewColumns 而不是

    BindUnitOfMeasurement((DataGridViewComboBoxCell)dgvNDC.Rows[0].Cells["UnitOfMeasurement"]);
BindType((DataGridViewComboBoxCell)dgvNDC.Rows[0].Cells["Type"]);   

利用

BindUnitOfMeasurement((DataGridViewComboBoxColumn)dgvNDC.Columns["UnitOfMeasurement"]);
BindType((DataGridViewComboBoxColumn)dgvNDC.Columns["Type"]);

并适当修改绑定方法。然后,您可以为组合添加带有空白值或指定值的行,它将起作用(其中一个具有指定为默认值的值,另一个留空供用户选择)

AddLine("Del", "", "", "", "XZ", "");

另外,我不确定这是否有必要,但在实验过程中,我还为每个组合框列添加了这个:

type.ValueType = typeof (string);
于 2013-01-18T18:21:33.753 回答