【问题标题】:How do you Programmatically set DataGridViewComboBoxCell value?你如何以编程方式设置 DataGridViewComboBoxCell 值?
【发布时间】:2013-01-17 21:09:48
【问题描述】:

我在设置 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);
        }
    }

【问题讨论】:

  • 为了简化...我设置了一个带有组合框列的数据网格,并将这些列绑定到数据源。为这些列添加具有空白值的行时,一切看起来都很好;组合有他们应该的选择。如果我尝试添加具有指定值的行,并且它们是组合框值存在的有效选择,则会收到错误消息。我在调试时注意到单元格没有“项目”,这似乎是一个问题......但不明白,因为当没有设置值时,选择就在那里。
  • 请注意,ValueMember 和 DisplayMember 是在绑定方法中的 CELL 上设置的。我在 COLUMN 上设置了 ValueMember、DisplayMember 和 DataPropertyName……但仍然得到相同的结果。

标签: c# winforms


【解决方案1】:

问题是我绑定的是单个 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2011-12-24
    相关资源
    最近更新 更多