SOLVED - Klasse ListBoxItem



  • Hallo.

    Ich habe eine Listbox, welche mir als Textausgabe für ein Programm dienst. Also, wenn eine Routine eine Meldung ausgeben will, geschieht das über dieses Steuerelement.

    class Output
        {
            public System.Windows.Forms.ListBox OLB;
    
            /*OLB is System.Windows.Form.ListBox*/
            public static void LogOut(string Text) {
                OLB.Items.Add(Text.ToString());
                OLB_AutoScroll(); 
            }
        }
    

    Funktioniert perfekt.

    Jetzt möchte ich aber gerne alte Einträge editieren, ohne groß suchen zu müssen. Dazu habe ich mir gedacht, ich erstelle mir eine Instanz von ListBoxItem, editiere diese, übergebe es mit .Items.Add an die ListBox und gebe sie zurück, so dass ich sie später editieren kann.
    Aber ich weiß nicht, wie ich bei einem ListBoxItem an den Text heran komme.

    /*Referenz auf PresentationFramework*/
    
    public static System.Windows.Controls.ListBoxItem LogOut(string Text){
        System.Windows.Controls.ListBoxItem LBI = new System.Windows.Controls.ListBoxItem());
        /*Irgendwie den Text editieren..."
        OLB.Items.Add(LBI);
        return LBI;
    }
    
    public static void ModifyLogOut(string Text, System.Windows.Controls.ListBoxItem LBI){
        LBI.Text = Text; /*Funktioniert natürlich nicht, da Member Text nicht vorhanden*/
    }
    

    Lange Rede, kurzer Sinn: Wie kann ich den Text in ListBoxItem editieren?

    Vielen Dank und Gruß,
    CJens



  • Hallo,

    wenn du mit DataBinding arbeitest erübrigt sich das Problem. Als kleines Beispiel:

    Klasse für LogEntries:

    public class LogEntry : INotifyPropertyChanged
    {
        private string _message;
        public string Message
        {
            get { return this._message; }
            set { 
                    if(this._message == value)
                        return;
                    this._message = value;
                    this.OnPropertyChanged("Message");
                }
        }
    
        private void OnPropertyChanged(string PropertyName)
        {
            if(this.PropertyChanged != null)
                  this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName);
        }
    
        public event PropertyChangedEventHandler PropertyChanged;    
    }
    

    Die LogEntries fügst du anschließend in eine BindingList ein:

    private void LogOut(string Text)
    {
         LogEntry entry = new LogEntry();
         entry.Message = Text;
         this._logEntries.Add(entry);
    }
    

    LogEntries ist vom Typ Bindinglist und wird an deine Listbox gehängt:

    public class FormMain : Form
    {
        private BindingList<LogEntry> _logEntries = new BindingList<LogEntry>()
    
        public FormMain()
        {
            this.InitializeComponents();
            this.OLB.DataSource = _logEntries;
        }
    }
    

    Soll der Text im nachhinein geändert werden, nimmst du einfach den Eintrag aus der List und änderst die Message-Property. - Anschließend ist in der Listbox der neue Text drin.



  • Hallo.

    Erstmal vielen Dank für den Tip. Ich könnte das so umbauen hätte aber vorher - der Vollständigkeit halber - die Frage, ob es mit meiner jetzigen Konstruktion gar nicht geht?

    Also, ist was Du gezeigt hast der einzige Weg, oder ein Weg? Denn mein Progamm ist schon etwas fortgeschritten und ich wollte nicht zu viel umwerfen.



  • Was soll die Verwendung von ListBoxItem (WPF) für eine WinForms.ListBox?

    In eine WinForms-ListBox kann man beliebige Objekte packen.
    Merke dir einfach den Index des hinzugefügten Items:

    public static int LogOut(string text)
    {
        int index = OLB.Items.Add(text);
        OLB_AutoScroll();
    
        return index;
    }
    

    Verwendung:

    int index = LogOut("blabla");
    
    OLB.Items[index] = "blub"; // bzw. schreib dir eine Methode für das Setzen (Editieren) eines Items
    


  • Danke Euch beiden. Funktioniert super.


Anmelden zum Antworten