回答链接:(Can I put a horizontal line in a combo box or list control?)
我在C#(VS 2010)Windows窗体中创建了一个代码,但它需要改进。项目前面的符号“ - ”会在项目后面显示一行。
我在组合项目集合中的输入如下:
-All Names
Henry (Father)
-Nancy (Mother)
Sapphire
Vincent
我的组合显示如下:
All Names
------------------
Henry (Father)
Nancy (Mother)
------------------
Sapphire
Vincent
我的代码是:
public Form1()
{
InitializeComponent();
comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
comboBox1.DrawItem += new DrawItemEventHandler(cmb_Type_DrawItem);
}
void cmb_Type_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
string a = comboBox1.Items[e.Index].ToString();
if (comboBox1.Items[e.Index].ToString().Substring(0, 1) == "-")
{
e.Graphics.DrawLine(Pens.Black, new Point(e.Bounds.Left, e.Bounds.Bottom - 1),
new Point(e.Bounds.Right, e.Bounds.Bottom - 1));
a = a.Substring(1, a.Length - 1);
}
TextRenderer.DrawText(e.Graphics, a,
comboBox1.Font, e.Bounds, comboBox1.ForeColor, TextFormatFlags.Left);
e.DrawFocusRectangle();
}
我需要的改进是在“cmb_Type_DrawItem”中我想要“comboBox1”进行参数化,所以当我调用它时可以应用于任何调用它的comboBox(不仅仅是comboBox1)。
答案 0 :(得分:2)
你可以像Blau建议的那样做,也可以创建一个将事件处理程序附加到组合框的函数。
void AttachHandler(ComboBox combo) {
combo.DrawMode = DrawMode.OwnerDrawFixed;
combo.DrawItem += new DrawItemEventHandler(cmb_Type_DrawItem);
}
然后,在表单构造函数中,您只需使用:
public Form1() {
AttachHandler(comboBox1);
AttachHandler(comboBox2);
}
答案 1 :(得分:1)
使用Martin的解决方案加上公共变量。
public Form1()
{
InitializeComponent();
AttachHandler(comboBox1);
AttachHandler(comboBox2);
AttachHandler(comboBox3);
AttachHandler(comboBox4);
AttachHandler(comboBox5);
}
void AttachHandler(ComboBox combo)
{
combo.DrawMode = DrawMode.OwnerDrawFixed;
combo.DrawItem += new DrawItemEventHandler(cmb_Type_DrawItem);
}
//using mycombo to make combobox variable
void cmb_Type_DrawItem(object sender, DrawItemEventArgs e)
{
var mycombo = (ComboBox) sender; // This is what I meant
e.DrawBackground();
string a = mycombo.Items[e.Index].ToString();
if (mycombo.Items[e.Index].ToString().Substring(0, 1) == "-")
{
e.Graphics.DrawLine(Pens.Black, new Point(e.Bounds.Left, e.Bounds.Bottom - 1),
new Point(e.Bounds.Right, e.Bounds.Bottom - 1));
a = a.Substring(1, a.Length - 1);
}
TextRenderer.DrawText(e.Graphics, a, mycombo.Font, e.Bounds, mycombo.ForeColor,
TextFormatFlags.Left);
e.DrawFocusRectangle();
}
答案 2 :(得分:0)
创建自己的组合框:
public class MyComboBox : ComboBox {
override DrawItem() {
....
}
}