1

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

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

我在尝试做不可能的事吗?

4

2 回答 2

4

并非不可能,但非常困难。您的建议不起作用,请注意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你需要的,所以你必须翻译,这就是我开始走下坡路的地方。

士兵,如果你愿意,这应该让你开始。但我认为这将是一条混乱而漫长的道路。

于 2013-09-10T18:58:53.387 回答
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);
于 2014-11-20T16:10:29.180 回答