【问题标题】:ComboBox DropDown where user cannot enter text用户无法输入文本的组合框下拉菜单
【发布时间】:2015-10-16 15:32:10
【问题描述】:

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

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

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

【问题讨论】:

  • 听起来你几乎需要 2 个 cbo,一个用于标准选择,一个用于自定义。
  • 绑定还是非绑定模式? combo.Items 中有什么?你在用DisplayMemberValueMember吗?

标签: c# vb.net winforms combobox


【解决方案1】:

您可以在这里使用 DataError 事件,并通过将 cell 转换为 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);
    }
  }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是一个有趣的解决方案,但我还需要处理其他事情,例如 Delete 键(不由 KeyPress 处理)和 Copy+Paste。
    • 处理这些按键并不难,但我觉得这可能是防止用户输入自己的信息的最佳方法
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多