如何格式化DataGridViewComboBoxColumn的ComboBox中的特定项目?

时间:2019-01-01 12:43:50

标签: c# .net winforms datagridview datagridviewcolumn

在(重新)创建DataGridView中的列的方法中,我具有与此类似的代码:

MyColumn = new DataGridViewComboBoxColumn()
{
    Name = "..",
    HeaderText = "..",
    SortMode = DataGridViewColumnSortMode.NotSortable
};       
MyColumn.Items.Clear();
foreach (string s in MyStringList)
{
    MyColumn.Items.Add(s);
}
MyColumn.Items.Add(""); 
// I would like this empty string to be shown as "No group" 
// with an italic grayed out font

我认为我可能必须为该列中的ComboBox-es的项目创建一个类,在其中应覆盖ToString()方法,但是我想知道如何格式化{{1} }项目。

一个相关的问题是here,它是关于不在DataGridView内的普通ComboBox的问题,答案是使用{{1}的No Group属性和DrawMode事件来解决问题}}类。

1 个答案:

答案 0 :(得分:0)

对于自定义绘画ComboBox,您需要处理EditingControlShowing,然后获取EditingControl的{​​{1}},然后将其DataGridViewComboBoxEditingControl设置为{ {1}}并处理其DrawMode事件。

对于自定义绘制单元格,您需要处理OwnerDrawFixed事件,并为单元格样式设置不同的字体和颜色,并使用新值继续绘制。您也可以根据需要绘制整个单元格。

enter image description here

示例

加载示例数据:

DrawItem

设置DataGridView列:

CellPainting

句柄EditingControlShowing

private DataTable LoadProducts()
{
    var dt = new DataTable();
    dt.Columns.Add("Name");
    dt.Columns.Add("CategoryId", typeof(int));
    dt.Rows.Add("P1", 1);
    dt.Rows.Add("P2", 1);
    dt.Rows.Add("P3", DBNull.Value);
    return dt;
}
private DataTable LoadCategories()
{
    var dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name");
    dt.Rows.Add(DBNull.Value, "No Category");
    dt.Rows.Add(1, "C1");
    dt.Rows.Add(2, "C2");
    dt.Rows.Add(2, "C3");
    return dt;
}

处理单元格绘画

private void Form1_Load(object sender, EventArgs e)
{
    var products = LoadProducts();
    var categories = LoadCategories();

    dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()
    {
        Name = "NameColumn",
        DataPropertyName = "Name",
        HeaderText = "Name"
    });
    dataGridView1.Columns.Add(new DataGridViewComboBoxColumn()
    {
        Name = "CategoryIdColumn",
        DataPropertyName = "CategoryId",
        HeaderText = "Category",
        DataSource = categories,
        ValueMember = "Id",
        DisplayMember = "Name",
        DisplayStyle= DataGridViewComboBoxDisplayStyle.Nothing
    });
    dataGridView1.DataSource = products;
    dataGridView1.EditingControlShowing += DataGridView1_EditingControlShowing;
    dataGridView1.CellPainting += DataGridView1_CellPainting;
}