在(重新)创建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
事件来解决问题}}类。
答案 0 :(得分:0)
对于自定义绘画ComboBox
,您需要处理EditingControlShowing
,然后获取EditingControl
的{{1}},然后将其DataGridViewComboBoxEditingControl
设置为{ {1}}并处理其DrawMode
事件。
对于自定义绘制单元格,您需要处理OwnerDrawFixed
事件,并为单元格样式设置不同的字体和颜色,并使用新值继续绘制。您也可以根据需要绘制整个单元格。
示例
加载示例数据:
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;
}