我可以将DrawItem事件处理程序与CheckedListBox一起使用吗?

时间:2013-09-10 17:15:06

标签: winforms c#-4.0 checkedlistbox ondrawitem

我想覆盖将项目添加到选中列表框时显示的文本。现在它正在使用obj.ToString(),但我想附加一些文本,而不更改对象ToString方法。我已经看到了处理ListBoxs的DrawItem事件的例子,但是当我尝试实现它们时,我的事件处理程序没有被调用。我注意到Winforms设计器似乎不允许我为DrawItem事件分配处理程序。顽固,我只是自己添加了代码

        listbox1.DrawMode = DrawMode.OwnerDrawVariable;
        listbox1.DrawItem += listbox1_DrawItem;

我是否想要做不可能的事?

2 个答案:

答案 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);