2015-10-16 88 views
1

我有一个Windows窗体,其中有一个DataGridView和一个ComboBox。当用户单击DGV中的某一行时,无论该值是否存在于ComboBox中,我都希望ComboBox文本显示该行中的值。但是,我还希望用户能够选择ComboBox中的项目,但无法输入自定义文本。ComboBox DropDown用户无法输入文本

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

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

+0

这听起来像你需要2个社区组织,一个是标准镐和一个自定义。 – Plutonix

+0

绑定或非绑定模式?你在combo.Items中有什么?你是否在使用DisplayMember和ValueMember? –

回答

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); 
    } 
    } 
} 
0

怎么样创建combobox_KeyPress然后添加一行e.KeyChar = Nothing这将阻止任何按键动作入禁区

+0

这是一个有趣的解决方案,但我还需要处理其他事情,如Delete键(不由KeyPress处理)和Copy + Paste。 – Kevin

+0

处理这些击键并不难,但我觉得这可能是防止用户输入他们自己的信息的最好方法 – jagler