我有一个带有DataGridView
和ComboBox
的Windows表单。当用户单击DGV中的行时,我希望ComboBox
文本显示行中的值,无论该值是否存在于ComboBox
中。但是,我还希望用户能够在ComboBox
中选择无法输入自定义文字的项目。
将DropDownStyle
更改为DropDownList
将无效,因为我无法以编程方式输入不存在的值。
我有一个想法是将样式更改为DropDownList
并临时添加自定义项目,然后在DGV中不再选择它们时将其删除,但我希望有更优雅的解决方案。任何帮助将不胜感激。
答案 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
,以防止任何击键进入框