Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式设置DataGridViewComboxCell值?_C#_Winforms - Fatal编程技术网

C# 如何以编程方式设置DataGridViewComboxCell值?

C# 如何以编程方式设置DataGridViewComboxCell值?,c#,winforms,C#,Winforms,设置DataGridViewComboxCell的值时遇到问题。datagridview列与选项/值绑定,但当我尝试使用comboBoxCells的指定列值添加dgv.Rows.Add或单独设置单元格的值时,它会生成“DataGridViewComboxCell值无效”错误。如果我为这些列添加一个带有空值的行,那么这些选项在组合框中显示得很好 我有一个对话框,它传递了一个简单对象NDCRecord的arraylist public class NDCRecord {

设置DataGridViewComboxCell的值时遇到问题。datagridview列与选项/值绑定,但当我尝试使用comboBoxCells的指定列值添加dgv.Rows.Add或单独设置单元格的值时,它会生成“DataGridViewComboxCell值无效”错误。如果我为这些列添加一个带有空值的行,那么这些选项在组合框中显示得很好

我有一个对话框,它传递了一个简单对象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";
      }
    }

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

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