Ich möchte die DrawItem-Funktion der ListBox außer Kraft setzen, aber ich scheitere. Ich habe verschiedene Snippets aus dem Internet und auch von msdn ausprobiert, aber manchmal funktioniert es nicht. Der Quellcode ist nur zum Testen, also kümmert es mich nicht um gute Struktur usw. Ich möchte ein funktionierendes Skript, von dem ich lernen und möglicherweise verbessern kann.C# ListBox DrawItem funktioniert nicht
Ich verwende MS VS 2015 RC und hinzugefügt Ereignisse über den Formular-Designer.
Momentan habe ich folgenden Quellcode. Mein Protokoll rte zeigt den Eintrag drawitem ebenfalls nicht an - er wird also nicht hinzugefügt.
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;
}
}
Set 'DrawMode' zu' OwnerDraw' – Plutonix
Dies ist ziemlich einfach, Sie haben einfach vergessen, die DrawMode-Eigenschaft der ListBox zu ändern. Es ist immer noch Normal. –