Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# ListBox DrawItem not working

Tags:

c#

listbox

I want to override the DrawItem function of the ListBox but I fail. I have tried various snippets from the web and also from msdn but somewhy it does not work. The sourcecode is just for testing so I does not care about good structure etc. I want a working script which I can learn from and possibly improve.

I am using MS VS 2015 RC and added events via the Form-Designer.

Currently I have following sourcecode. My log rte does not display the drawitem entry either - so it's not being added.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;
}
}
like image 608
AMartinNo1 Avatar asked Jun 27 '15 12:06

AMartinNo1


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.

Is C programming hard?

C is more difficult to learn than JavaScript, but it's a valuable skill to have because most programming languages are actually implemented in C. This is because C is a “machine-level” language. So learning it will teach you how a computer works and will actually make learning new languages in the future easier.


1 Answers

According to MSDN for ListBox.DrawMode:

This event is used by an owner-drawn ListBox. The event is only raised when the DrawMode property is set to DrawMode.OwnerDrawFixed or DrawMode.OwnerDrawVariable. You can use this event to perform the tasks needed to draw items in the ListBox. If you have a variable-sized item (when the DrawMode property is set to DrawMode.OwnerDrawVariable), before drawing an item, the MeasureItem event is raised. You can create an event handler for the MeasureItem event to specify the size for the item that you are going to draw in your event handler for the DrawItem event.

like image 156
Mark T Avatar answered Sep 20 '22 11:09

Mark T