C#ListBox DrawItem不起作用

时间:2015-06-27 12:22:28

标签: c# listbox

我想覆盖ListBox的DrawItem函数但是我失败了。我尝试过来自网络和msdn的各种片段,但是为什么它不起作用。 源代码仅用于测试,因此我不关心良好的结构等。我想要一个可以学习并可能改进的工作脚本。

我正在使用MS VS 2015 RC并通过Form-Designer添加活动。

目前我有以下源代码。我的log rte也没有显示drawitem条目 - 所以它没有被添加。enter image description here

Form1.cs的

using System;
using System.Drawing;
using System.Windows.Forms;

namespace CustomFormElements
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.listBox1.Items.Add("Test");
        this.listBox1.Items.Add("Test1");
        this.listBox1.Items.Add("Test2");
        this.listBox1.Items.Add("Test3");
        this.listBox1.Items.AddRange( new Object[] { "Test4", "Test5", "Test6" });
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {

    }

    private void AddToLog(string text)
    {
        this.richTextBox1.Text = this.richTextBox1.Text + text + "\r\n";
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.AddToLog("SelectedIndexChanged");
    }

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        this.AddToLog("DrawItem");
        bool isSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);

        if (e.Index > -1)
        {
            /* If the item is selected set the background color to SystemColors.Highlight 
             or else set the color to either WhiteSmoke or White depending if the item index is even or odd */
            Color color = isSelected ? SystemColors.Highlight :
                e.Index % 2 == 0 ? Color.Green : Color.SandyBrown;

            // Background item brush
            SolidBrush backgroundBrush = new SolidBrush(color);
            // Text color brush
            SolidBrush textBrush = new SolidBrush(e.ForeColor);

            // Draw the background
            e.Graphics.FillRectangle(backgroundBrush, e.Bounds);
            // Draw the text
            e.Graphics.DrawString(listBox1.GetItemText(listBox1.Items[e.Index]), e.Font, textBrush, e.Bounds, StringFormat.GenericDefault);

            // Clean up
            backgroundBrush.Dispose();
            textBrush.Dispose();
        }
        e.DrawFocusRectangle();
    }

    private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
    {
        this.AddToLog("MeasureItem");
    }

    private void listBox1_Enter(object sender, EventArgs e)
    {
        this.AddToLog("Enter");
    }

    private void listBox1_Leave(object sender, EventArgs e)
    {
        this.AddToLog("Leave");
    }

    private void listBox1_Click(object sender, EventArgs e)
    {
        this.AddToLog("Click");
    }
}
}

Form1.Designer.cs

namespace CustomFormElements
{
partial class Form1
{
    /// <summary>
    /// Erforderliche Designervariable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Verwendete Ressourcen bereinigen.
    /// </summary>
    /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Vom Windows Form-Designer generierter Code

    /// <summary>
    /// Erforderliche Methode für die Designerunterstützung.
    /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    /// </summary>
    private void InitializeComponent()
    {
        this.listBox1 = new System.Windows.Forms.ListBox();
        this.richTextBox1 = new System.Windows.Forms.RichTextBox();
        this.SuspendLayout();
        // 
        // listBox1
        // 
        this.listBox1.FormattingEnabled = true;
        this.listBox1.Location = new System.Drawing.Point(13, 13);
        this.listBox1.Name = "listBox1";
        this.listBox1.Size = new System.Drawing.Size(332, 303);
        this.listBox1.TabIndex = 0;
        this.listBox1.Click += new System.EventHandler(this.listBox1_Click);
        this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);
        this.listBox1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.listBox1_MeasureItem);
        this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
        this.listBox1.Enter += new System.EventHandler(this.listBox1_Enter);
        this.listBox1.Leave += new System.EventHandler(this.listBox1_Leave);
        // 
        // richTextBox1
        // 
        this.richTextBox1.Location = new System.Drawing.Point(361, 13);
        this.richTextBox1.Name = "richTextBox1";
        this.richTextBox1.Size = new System.Drawing.Size(479, 303);
        this.richTextBox1.TabIndex = 1;
        this.richTextBox1.Text = "";
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(1009, 475);
        this.Controls.Add(this.richTextBox1);
        this.Controls.Add(this.listBox1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.Load += new System.EventHandler(this.Form1_Load);
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.ListBox listBox1;
    private System.Windows.Forms.RichTextBox richTextBox1;
}
}

1 个答案:

答案 0 :(得分:12)

根据{em> ListBox.DrawMode 的MSDN

  

此事件由所有者绘制的ListBox使用。该活动仅被提出   当DrawMode属性设置为DrawMode.OwnerDrawFixed或   DrawMode.OwnerDrawVariable。您可以使用此事件来执行   在ListBox中绘制项目所需的任务。如果你有   可变大小的项(当DrawMode属性设置为时   DrawMode.OwnerDrawVariable),在绘制项目之前,MeasureItem   事件被提出。您可以为MeasureItem创建事件处理程序   event指定要绘制的项目的大小   DrawItem事件的事件处理程序。