Avatar billede ibleif Nybegynder
12. februar 2005 - 21:19 Der er 7 kommentarer og
1 løsning

Super mystisk GUI problem ?

Hejsa alle...

Jeg er løbet ind i en underlig opførsel i et lille windows applikations projekt. Vil gerne høre om nogen har en ide til hvad der kan være gal.

Jeg har et treeview, som når jeg tilføjer et element via Add(string) metoden, så stopper metoden simpelthen der. Metoden bliver kaldt igennem et observer pattern´s updateobservers, men dette burde jo ikke gøre metoden anderledes.

Har prøvet at debugge gennem Visual Studio, og lige meget hvad jeg gør, så når den kommer til linjen:

mitTreeView.Nodes.Add(EtObjekt.StringProperty)

- så går den ud af metoden! Er helt på bar bund, hvis jeg sætter en knap ind og laver et event på den, som bare tilføjer en node på samme måde, så gør den det fint nok.

Har selvfølgelig testet af variablen som jeg indsætter indeholde en streng og at den streng ikke er tom.

Det er VIRKELIG underligt....

Nogen ideer?

// Ibleif
Avatar billede ibleif Nybegynder
12. februar 2005 - 21:31 #1
Et tydeligt eksempel på at det virkelig ER i den linje, som den stopper er, at hvis jeg laver en MessageBox.Show() lige før og lige efter linjen, så kommer den første fint nok, men nummer 2 gør aldrig...

Er virkelig forvirret hvordan det kald kan få en metode til at stoppe.

// Ibleif
Avatar billede ibleif Nybegynder
12. februar 2005 - 22:26 #2
Endnu en mærkelig ting at tilføje..

Hvis jeg laver det TreeView om til et ListView og tilføjer et element til det, så virker det helt efter hensigten! ?!?!?!?!?!?!?!

Mærkeligt eller hvad! :-)

// Ibleif
Avatar billede ibleif Nybegynder
12. februar 2005 - 22:43 #3
Måske jeg har fundet en lille .NET framework bug her!

Nogen der ved hvor man kan finde en officel liste over bugs ?

// Ibleif
Avatar billede ibleif Nybegynder
12. februar 2005 - 22:51 #4
Sidste besked her... :-)

200 point til nogen som af/bekræfte mit problem ved at lave et lille eksempel der bruger observerpattern, og som ved updateobservers() tilføjer noget til et treeview!

// Ibleif
Avatar billede burningice Nybegynder
12. februar 2005 - 23:17 #5
:) bug er det vist ikke helt...

// Form

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace _590467
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form, IObserver
    {
        private StringCollection stringColl;
        private System.Windows.Forms.TreeView treeView1;
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            InitializeComponent();

            stringColl = new StringCollection(this);
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.treeView1 = new System.Windows.Forms.TreeView();
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // treeView1
            //
            this.treeView1.ImageIndex = -1;
            this.treeView1.Location = new System.Drawing.Point(16, 16);
            this.treeView1.Name = "treeView1";
            this.treeView1.SelectedImageIndex = -1;
            this.treeView1.Size = new System.Drawing.Size(121, 232);
            this.treeView1.TabIndex = 0;
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(176, 24);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(96, 32);
            this.button1.TabIndex = 1;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.treeView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        public void UpdateObserver()
        {
            this.treeView1.Nodes.Clear();

            foreach(String s in this.stringColl)
            {
                this.treeView1.Nodes.Add(s);
            }
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            this.stringColl.Add("hej");
            this.stringColl.Add("med");
            this.stringColl.Add("dig");
            this.stringColl.Add(":)");

            this.stringColl.UpdateObservers();
        }
    }
}

// IObserver

using System;

namespace _590467
{
    /// <summary>
    /// Summary description for IObserver.
    /// </summary>
    public interface IObserver
    {
        void UpdateObserver();
    }
}

// StringCollection

using System;
using System.Collections;

namespace _590467
{
    /// <summary>
    /// Summary description for StringCollection.
    /// </summary>
    public class StringCollection : System.Collections.Specialized.StringCollection
    {
        private ArrayList observerCollection = new ArrayList();

        public StringCollection(IObserver observer) : base()
        {
            this.observerCollection.Add(observer);
        }

        public void UpdateObservers()
        {
            foreach (IObserver observer in this.observerCollection)
            {
                observer.UpdateObserver();
            }
        }
    }
}
Avatar billede burningice Nybegynder
12. februar 2005 - 23:18 #6
dog kan problemet måske ligge i at din program er multithreaded?
Avatar billede ibleif Nybegynder
14. februar 2005 - 06:25 #7
Mit problem lå netop i at mit system var distribueret (og dermed multithreaded!).

Kaldet til mit observerpattern kommer fra en anden applikation, og ligeprævis et tree-view må kun opdateres fra sin egen tråd.

Hvis andre løber ind i samme problem, så kan jeg sige, at løsningen er - Enten at bruge et listview! *g* - eller også bruge Invoke metoden på tree-view kontrollen. Her kan man med en delegate få sit GUI opdateret fra den rigtige tråd.

Mange tak fordi du prøvede at genskabe fejlen, og hvis du ligger et svar, så skal du få de point. Om ikke andet, så kan det bruges til andre der skal have et eksempel på Observer-pattern! :-)

// Ibleif
Avatar billede burningice Nybegynder
14. februar 2005 - 07:38 #8
det er ikke kun treeview. Generelt bør alt GUI-relateret køres fra en og samme tråd, og hvis man har brug for at kalde nogle "GUI-metoder" fra andre tråde skal man bruge Invoke. Det gælder også f.eks. listview, selvom den måske ikke brokker sig på samme måde.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester