用户无法输入文本的ComboBox DropDown

时间:2015-10-16 15:32:11

标签: c# vb.net winforms combobox

我有一个带有DataGridViewComboBox的Windows表单。当用户单击DGV中的行时,我希望ComboBox文本显示行中的值,无论该值是否存在于ComboBox中。但是,我还希望用户能够在ComboBox中选择无法输入自定义文字的项目。

DropDownStyle更改为DropDownList将无效,因为我无法以编程方式输入不存在的值。

我有一个想法是将样式更改为DropDownList并临时添加自定义项目,然后在DGV中不再选择它们时将其删除,但我希望有更优雅的解决方案。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以在此处使用DataError事件,并通过将单元转换为DataGridViewComboBoxCell并将缺少的项添加到其集合中,将缺少的项添加到集合中:

public Form1() {
  InitializeComponent();

  DataTable dt = new DataTable();
  dt.Columns.Add("C1");

  DataRow dr1 = dt.NewRow();
  dr1[0] = "ccc";
  dt.Rows.Add(dr1);
  DataRow dr2 = dt.NewRow();
  dr2[0] = "xxx";
  dt.Rows.Add(dr2);

  dgv.AutoGenerateColumns = false;

  var dgvCB = new DataGridViewComboBoxColumn();
  dgvCB.Items.AddRange(new string[] { "aaa", "bbb", "ccc", "ddd" });
  dgv.Columns.Add(dgvCB);
  dgv.Columns[0].DataPropertyName = "C1";

  dgv.DataError += dgv_DataError;
  dgv.DataSource = dt;
}

void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) {
  if (e.ColumnIndex == 0) {
    string value = dt.Rows[e.RowIndex][e.ColumnIndex].ToString();
    var dgvCB = (DataGridViewComboBoxCell)dgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
    if (!dgvCB.Items.Contains(value)) {
      dgvCB.Items.Add(value);
    }
  }
}

答案 1 :(得分:0)

如何创建combobox_KeyPress然后添加行e.KeyChar = Nothing,以防止任何击键进入框