更新现有的 DataGridViewComboBoxColumn Items 集合

Updating the existing DataGridViewComboBoxColumn Items collection

我们有 DataGridViewComboBoxColumn,其中有四个固定值。在事件 dataGridView1_EditingControlShowing 发生的 运行 时间内,我们正在尝试将新项目附加到 DataGridViewComboBoxColumn

private void dataGridView1_EditingControlShowing(object sender, 
                                             DataGridViewEditingControlShowingEventArgs e)
{
   ComboBox combo = e.Control as ComboBox;
   if (combo != null)
   {
      combo.DropDown += new System.EventHandler(ComboBox1_DropDown);
   }
}

private void ComboBox1_DropDown(object sender, System.EventArgs e)
{
   ComboBox comboBox = (ComboBox)sender;
   if (comboBox.Items != null)
   {
      List<String> elementname = Elements();
      foreach (string s in elementname)
      {
         if (!comboBox.Items.Contains(s))
         {
            comboBox.Items.Add(s);
         }
      }
   }
}

我遇到了这个异常:

能否建议如何将值添加到 Items 集合中的现有 DataGridViewComboBoxColumn

您正在添加到 Items 编辑控件中,而不是添加到 ComboBoxColumnItems 中,最终将用于验证。

为了轻松访问托管 DGV,我们使用特殊类型 DataGridViewComboBoxEditingControl。 现在我们将在 ComboBox1_DropDown 事件中将新选择添加到两个 Items 集合中::

DataGridViewComboBoxEditingControl comboBox = (DataGridViewComboBoxEditingControl)sender;
DataGridView dgv = comboBox.EditingControlDataGridView; 
if (comboBox.Items != null && dgv != null)
{
    DataGridViewComboBoxColumn dcbc =
        (DataGridViewComboBoxColumn) dgv.Columns[dgv .CurrentCell.ColumnIndex];

    List<String> elementname = Elements.ToList();
    foreach (string s in elementname)
    {
        if (!comboBox.Items.Contains(s))
        {
          comboBox.Items.Add(s);
          dcbc.Items.Add(s);
        }
    }
}

注意

新的 Items 将不会 persistet 除非您为它编写代码。

因此,如果您已将字段设置为新值并保存它们,您还必须在重新加载 DGV 之前保存并重新加载这些新值,否则这些值将不在 Column 的列表中值并再次抛出 DataError

通常存储它们的地方是您的 DBMS 中的 DataTable,但也可以使用任何其他外部存储,例如 XML 文件或 dynamic resources 等。但 DBMS 是 imo 最自然的选择。