你如何以编程方式设置DataGridViewComboBoxCell值?

时间:2013-01-17 21:09:49

标签: c# winforms

我无法设置DataGridViewComboBoxCell的值。 datagridview列与选项/值绑定,但是当我尝试使用指定的comboBoxCells列值的dgv.Rows.Add或单独设置单元格的值时,它会生成“DataGridViewComboBoxCell值无效”错误。如果我为这些列添加一个包含空白值的行,则组合中的选项显示就好了。

我有一个对话框,它传递了一个简单对象NDCRecord的arraylist。

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);
        }
    }

1 个答案:

答案 0 :(得分:0)

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

在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);