我想覆盖将项目添加到选中列表框时显示的文本。现在它正在使用obj.ToString(),但我想附加一些文本,而不更改对象ToString方法。我已经看到了处理ListBoxs的DrawItem事件的例子,但是当我尝试实现它们时,我的事件处理程序没有被调用。我注意到Winforms设计器似乎不允许我为DrawItem事件分配处理程序。顽固,我只是自己添加了代码
listbox1.DrawMode = DrawMode.OwnerDrawVariable;
listbox1.DrawItem += listbox1_DrawItem;
我是否想要做不可能的事?
答案 0 :(得分:3)
并非不可能,但难以置信。您建议的内容不起作用,请注意方法CheckedListBox
的课程DrawItem
中的元数据:
// Summary:
// Occurs when a visual aspect of an owner-drawn System.Windows.Forms.CheckedListBox
// changes. This event is not relevant to this class.
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public event DrawItemEventHandler DrawItem;
因此,您唯一的选择是从CheckedListBox
派生自己的班级,在我的有限测试中,这将是一条漫长的道路。你可以简单地处理绘图,如下:
public class CustomCheckedListBox : CheckedListBox
{
protected override void OnDrawItem(DrawItemEventArgs e)
{
String s = Items[e.Index].ToString();
s += "APPEND"; //do what you like to the text
CheckBoxState state = GetCheckBoxState(e.State); // <---problem
Size glyphSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, state);
CheckBoxRenderer.DrawCheckBox(
e.Graphics,
e.Bounds.Location,
new Rectangle(
new Point(e.Bounds.X + glyphSize.Width, e.Bounds.Y),
new Size(e.Bounds.Width - glyphSize.Width, e.Bounds.Height)),
s,
this.Font,
false,
state);
}
}
请注意方法GetCheckBoxState()
。你在DrawItemEventArgs
得到的是DrawItemState
,而不是你需要的CheckBoxState
,所以你必须翻译,这就是我开始走下坡路的地方。
士兵,如果你愿意,这应该让你开始。但我认为这将是一条混乱,漫长的道路。
答案 1 :(得分:0)
我在DonBoitnotts的回答中继续工作。
“GetCheckBoxState”是使用只有两种状态的非常有限的集合实现的。
var state = GetItemChecked(e.Index) ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal;
垂直对齐复选框并左对齐文字。
var b = e.Bounds;
int checkPad = (b.Height - glyphSize.Height) / 2;
CheckBoxRenderer.DrawCheckBox(g, new Point(b.X + checkPad, b.Y + checkPad),
new Rectangle(
new Point(b.X + b.Height, b.Y),
new Size(b.Width - b.Height, b.Height)),
text, this.Font, TextFormatFlags.Left, false, state);