2015-06-27 3 views
5

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. 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; 
} 
} 
+3

Set 'DrawMode' zu' OwnerDraw' – Plutonix

+1

Dies ist ziemlich einfach, Sie haben einfach vergessen, die DrawMode-Eigenschaft der ListBox zu ändern. Es ist immer noch Normal. –

Antwort

8

Nach MSDN für ListBox.DrawMode:

Dieses Ereignis wird von einer vom Eigentümer gezeichneten ListBox verwendet. Das Ereignis wird nur ausgelöst , wenn die DrawMode-Eigenschaft auf DrawMode.OwnerDrawFixed oder DrawMode.OwnerDrawVariable festgelegt ist. Sie können dieses Ereignis verwenden, um die Aufgaben auszuführen, die zum Zeichnen von Elementen in der ListBox erforderlich sind. Wenn Sie über ein Element variabler Größe verfügen (wenn die DrawMode-Eigenschaft auf DrawMode.OwnerDrawVariable festgelegt ist), wird vor dem Zeichnen eines Elements das MeasureItem-Ereignis ausgelöst. Sie können einen Ereignishandler für das MeasureItem-Ereignis erstellen, um die Größe für das Element anzugeben, das Sie in Ihren Ereignishandler für das DrawItem-Ereignis zeichnen möchten.

+0

Danke. Gibt es einen Grund, warum MS VS DrawMode beim Hinzufügen eines DrawItem-Ereignisses nicht ändert? – AMartinNo1

+0

AFAIK, VS ändert keine Eigenschaften, wenn Sie einen Ereignishandler hinzufügen. Ich schätze, es liegt daran, dass die VS-Entwickler nicht Ihre Absichten annehmen wollen. Möglicherweise fügen Sie den Ereignishandler zu Debugzwecken hinzu und möchten nicht, dass er im Produktionscode ausgelöst wird. –