动态列表框,每个都有DrawItem事件

时间:2017-10-18 13:37:18

标签: c# dynamic listbox event-handling draw

我正在创建一个TabControl,它在每个动态创建的TabPage上包含一个动态创建的ListBox,每个ListBox都有不同的内容。 对于每个ListBox,我想处理内部的文本(根据显示的代码中不可见的状态更改它的颜色)。

目前,我通过使用包含文本颜色和将用于行的消息的类来为特定ListBox着色文本。

用于手动创建的ListBox的代码示例:

    private void listBoxLogs_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index < 0)
        {
            return;
        }

        ListBoxLogsItem item = listBoxLogs.Items[e.Index] as ListBoxLogsItem;
        if (item != null)
        {
            e.DrawBackground();

            e.Graphics.DrawString(item.m_message, listBoxLogs.Font, item.m_color, e.Bounds, System.Drawing.StringFormat.GenericDefault);

            System.Drawing.Graphics g = listBoxLogs.CreateGraphics();
            System.Drawing.SizeF s = g.MeasureString(item.m_message, listBoxLogs.Font);

            if (s.Width > listBoxLogs.HorizontalExtent)
            {
                listBoxLogs.HorizontalExtent = (int)s.Width + 2;
            }
        }
    }

以下代码用于创建TabPage和ListBox:

    // _tagName is an identifier used to know the TabPage and ListBox in which the text will be added
    private void AddTabPage(string _tagName)
    {
        ListBox listBox = new ListBox();
        listBox.Text = _tagName;
        listBox.Name = _tagName;
        listBox.Location = new System.Drawing.Point(6, 6);
        listBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
        listBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBoxLogs_DrawItem);
        listBox.Size = new System.Drawing.Size(628, 378);
        listBox.FormattingEnabled = true;
        listBox.HorizontalScrollbar = true;
        listBox.ItemHeight = 17;
        listBox.TabIndex = 15;

        // TODO: Remove this line. Added just for testing
        listBox.Items.Add(new ListBoxLogsItem(System.Drawing.Brushes.Black, ""));

        TabPage tab = new TabPage();
        tab.Name = _tagName;
        tab.Controls.Add(listBox);

        // Add the TabPage to the TabControl only when it's available
        ExecuteOnControlThread(delegate
        {
            tabControl.Controls.Add(tab);
        });
    }

我无法弄清楚如何识别调用DrawItemEventHandler&#34; this.listBoxLogs_DrawItem&#34;的ListBox。

有人可以告诉我如何做到这一点,或者以不同的方式让我得到相同的结果?

1 个答案:

答案 0 :(得分:2)

sender是引发您正在处理的事件的控件。在“属性”网格中创建处理程序时,所选控件是什么? ListBox。这就是提高事件的控制因素。

private void listBoxLogs_DrawItem(object sender, DrawItemEventArgs e)
{
    ListBox lbSender = (ListBox)sender;

    // ...other stuff
}

通常,在处理程序方法中粘贴断点并在引发事件时在运行时检查参数。这总是一种快速获取这些东西的方法。