ListBox Programm nachträglich colorieren

Alfons2

Mitglied
Hi, ich habe bereits ein fertiges Programm hier, welches mit einer ListBox arbeitet, dort werden mehrere Dinge ausgegeben und um das übersichtlicher zu gestalten, wollte ich es farblich machen.

Laut den Quellen hier:
Code:
http://www.codeproject.com/KB/combobox/colorlistbox.aspx
http://www.mycsharp.de/wbb2/thread.php?threadid=6368
http://www.mikrocontroller.net/topic/86128
usw.
ist das auch an sich nicht schwer. Nur weiß ich nicht wie ich es regeln soll, das meine Einträge eingefärbt "nachträglich" eingefärbt werden, ohne das ich nun alles umbauen muss. Hier mal mein Code, der die ListBox beschreibt:
Code:
BackgroundWorker worker = sender as BackgroundWorker;
            // Liste der Hosts als Argument
            string[] hostNames = e.Argument as string[];

            if (hostNames != null && hostNames.Length != 0)
            {
                foreach (string hostname in hostNames)
                {
                    // Abbrechen...
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        break;
                    }

                    if (!String.IsNullOrEmpty(hostname))
                    {

                        IP_Hostname iphost = new IP_Hostname();
                        string hostnamefromip = iphost.IP_zu_Hostname(hostname);

                        // Host abfragen...
                        string message = null;
                        try
                        {
                            using (Ping pingSender = new Ping())
                            {
                                

                                reply = pingSender.Send(hostname, PingTimeout);
                                if (reply.Status == IPStatus.Success)
                                {
                                    // Hier müsste nun der Code zum einfärben hin, in diesem Fall Grün
                                    // 
                                    message = String.Format("{0}({1}): {2} ms",
                                        hostname, hostnamefromip, reply.RoundtripTime);
                                }
                                else
                                    // Hier müsste nun der Code zum einfärben hin, in diesem Fall Rot
                                    // 
                                    message = String.Format("{0}({1}): {2}",
                                        hostname, hostnamefromip, reply.Status);
                            }
                        }
                          
                        catch (Exception ex)
                        {
                           // Hier müsste nun der Code zum einfärben hin, in diesem Fall auch Rot
                           // 
                            message = String.Format("{0}({1}): {2}",
                                hostname, hostnamefromip, ex.Message);
                        }
                        
                        // Aktualisieren hier als Text
                        worker.ReportProgress(hostNames.Length / 100 + 1, message);
                        
                    }
                }
           // }
            }
            if (repeat == true)
            {
                System.Threading.Thread.Sleep(repeatvalue);
            }

Als Hintergrund, das Programm pingt IP-Adressen an



Mit freundlichen Grüßen

Alfons
 
Zuletzt bearbeitet:
Hi

Wie stellst du dir das vor, eine Software zu patchen ohne den SourceCode zu ändern und dann auch neu zu kompilieren?
Die Technologie ist noch nicht soweit fortgeschritten, dass sich Programme selbst ändern können.
 
Ich meinte nicht, nicht ändern, sondern nicht ALLES umstricken.

In der Konsolenprogrammierung, gibt es z.B. einen Befehl den man nur davor, bzw. dahinter schreiben muss, zur farblichen änderung.

In dem einen Beispiel ist es dort mit einem Array gelöst. Ich will nun aber nicht erstmal alles in ein Array schreiben um es einzufärben, das muss doch noch anders gehen....
 
An welcher Stelle in deinem Code kommen die Einträge in die ListView?
In die ItemsCollection der ListView kannst du beliebige Objekte hineinstecken. Die ListView ruft dann die ToString-Methode des Objekts auf und verwendet das Ergebnis als Text. Das heißt, du erstellst dir eine Klasse, die alle Informationen speichert, die du zum Darstellen eines ListView-Eintrags benötigst, also in deinem Fall zum Beispiel auch den Reply-Status. Mit diesen Objekten füllst du dann deine ItemsCollection der ListView.
Dann abonnierst du das DrawItem-Event wie in den Links oben beschrieben und prüfst den Reply-Status deines Objekts und wählst entsprechend die Farbe aus.
 
Okay, es wird je nach dem ob Erfolgreich war oder nicht, die string Variable message definiert. Das wird dann an die ListBox weitergegeben.

Muss ich da nun wirklich ein Listview daraus machen? Und wenn ja wie? Kannst du mir evtl. ein Code-Beispiel geben, dass das ganze veranschaulicht?
 
Ne, sollte mit ListBox genauso funktionieren.
Edit:
Hier ein Code-Beispiel mit DrawMode auf OwnerDrawFixed (bedeutet, dass wir nur die Farben ändern möchten, nicht die Größe der Fläche, die einem Eintrag zustehen soll)
C#:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.listBox1.DrawItem += new DrawItemEventHandler(listBox1_DrawItem);
            // Items erstellen und in ListBox füllen
            for (int i = 0; i < 10; i++)
            {
                this.listBox1.Items.Add(new MyListBoxItem("Status " + i.ToString(), i));
            }

        }

        void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            e.DrawFocusRectangle();
            MyListBoxItem currentItem = (MyListBoxItem)((ListBox)sender).Items[e.Index];
            Brush Pinsel = (currentItem.Status < 5) ? System.Drawing.Brushes.Red : System.Drawing.Brushes.Green;
            e.Graphics.DrawString(currentItem.Text, e.Font, Pinsel, (RectangleF)e.Bounds);
        }
    }

    /// <summary>
    /// Klasse zum Speichern von Informationen die wichtig sind, um den Text in einer hübschen Farbe darzustellen.
    /// </summary>
    public class MyListBoxItem
    {
        int _Status;
        public int Status { get { return _Status; } }

        String _Text;
        public String Text { get { return _Text; } }


        public override string ToString()
        {
            return this.Text;
        }

        public MyListBoxItem(string text, int status)
        {
            _Text = text;
            _Status = status;
        }
    }
}
 
Zuletzt bearbeitet:
Cool danke!

Ich schau mir das Beispiel nun mal genauer an und bastel es bei mir rein, ich lass es euch dann Wissen ob ich es geschafft habe oder nicht.

EDIT:

Alles klar es läuft, vielen dank nochmal! Nun eine Frage hätte ich da noch, ist es möglich, die Farbe aus einer string Variable auszulesen und sie dann mit Drawing.Brushes zu benutzen? die Variable dahinter zu hängen geht ja nicht, aber vielleicht gibt es noch eine andere Möglichkeit.
 
Zuletzt bearbeitet:
Zurück