【问题标题】:C# ListBox DrawItem not workingC# ListBox DrawItem 不工作
【发布时间】:2015-06-27 12:22:27
【问题描述】:

我想重写 ListBox 的 DrawItem 函数,但我失败了。我已经尝试了来自网络和 msdn 的各种 sn-ps,但不知何故它不起作用。 源代码仅用于测试,所以我不关心良好的结构等。我想要一个可以学习并可能改进的工作脚本。

我正在使用 MS VS 2015 RC 并通过表单设计器添加事件。

目前我有以下源代码。我的日志 rte 也不显示 drawitem 条目 - 所以它没有被添加。

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;
}
}

【问题讨论】:

  • DrawMode设置为OwnerDraw
  • 这是相当基本的,您只是忘记更改 ListBox 的 DrawMode 属性。还是正常的。

标签: c# listbox


【解决方案1】:

根据MSDN for ListBox.DrawMode

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

【讨论】:

  • AFAIK,当您添加事件处理程序时,VS 不会修改任何属性。我想这是因为 VS 开发人员不想假设您的意图。您可能会出于调试目的添加事件处理程序,并且不希望它在生产代码中触发。
猜你喜欢
  • 2012-02-08
  • 2016-08-19
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多