簡體   English   中英

我如何制作自己的DataGridView列

[英]How do I make my own DataGridView Column

我想做的就是

  • 一個DataGridViewDropdownColumn,在每個單元格的下拉列表中顯示不同的項目。
  • 一個DataGridViewHybridColumn,它為每個單元格顯示一個TextBox或ComboBox。

我讀了本書,並做了自己的DataGridViewBarColumn,但是我絲毫不知道如何實現這樣的東西。

即使DataGridView中最多可以有10萬行,性能也不重要,我將在以后進行優化。

我認為它們的處理方式相同,所以我要問一個問題

我能給您的是實現它的起點:

首先,准備綁定並創建DataGridViewComboBoxColumn。

private List<string> list = new List<string>();

public Form1()
{
        InitializeComponent();

        // Data source for you dropdown list
        list.Add("First Option");
        list.Add("Second Option");
        list.Add("Third Option");

        dataGridView1.AutoGenerateColumns = false;
        dataGridView1.MultiSelect = false;
        dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
        dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
        dataGridView1.CellValidating += new DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);
        dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
        dataGridView1.DataError += dataGridView1_DataError;

        // Formatting your ComboBox
        DataGridViewComboBoxColumn comboColumn = new DataGridViewComboBoxColumn();
        comboColumn.FlatStyle = FlatStyle.Flat;
        comboColumn.HeaderText = "Hybrid Data Grid Column";
        comboColumn.DataPropertyName = "Tag";
        //comboColumn.DataSource = list;        

        dataGridView1.Columns.Add(comboColumn);
        dataGridView1.DataSource = list;

}

其次,鍵入后附加一個事件以進行編輯:

    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        var combo = ((DataGridView)sender).CurrentCell as DataGridViewComboBoxCell;
        if (combo == null)
        {
            return;
        }
        if (!combo.Items.Contains(e.FormattedValue))
        {
            // Add the text you type into you bound list and refresh binding
            list.Add(e.FormattedValue.ToString());
            DataGridViewComboBoxColumn col = ((DataGridView)sender).CurrentCell.OwningColumn as DataGridViewComboBoxColumn;
            col.Items.Clear();
            col.Items.AddRange(list);
        }

        // Display what you type
        ((DataGridView)sender).CurrentCell.Value = e.FormattedValue;
    }

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        ComboBox comboControl = e.Control as ComboBox;
        if (comboControl != null)
        {
            if (comboControl.DropDownStyle != ComboBoxStyle.DropDown)
            {
                comboControl.DropDownStyle = ComboBoxStyle.DropDown;
            }
            //Update Items if list has changed (assumes items can't be deleted)
            if (comboControl.Items.Count != list.Count)
            {
                DataGridViewComboBoxColumn col = ((DataGridView)sender).CurrentCell.OwningColumn as DataGridViewComboBoxColumn;
                col.Items.Clear();
                col.Items.AddRange(list.ToArray());
                //Note: current cell's items don't appear to be refreshed by the lines above
                comboControl.Items.Clear();
                comboControl.Items.AddRange(list.ToArray());
            }
        }
    }

樣本輸出:

在此處輸入圖片說明

注意:由於我們在綁定列表中添加了文本輸入,因此可能會發生以下情況:單擊下拉菜單選項后,您將看到其他輸入。 因此,我將它留給您進行完善。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM