2015-10-16 110 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