Avatar billede Droa Seniormester
08. oktober 2009 - 14:33 Der er 10 kommentarer og
1 løsning

delegate fra trå til listbox, igennem methode?

Hej eksperter, jeg har prøve og kigge på delegate, og syntes det er ekstremt svært.. så jeg prøvede og lave noget med det.

Jeg prøver og køre en tråd "t", af Klassens "dataloader" methode "LoadXML", og sende løbende data til min main, men det er som om jeg er stødt på grund, da min methode jeg sender til SKAL være statisk? så kan jeg bare ikek have listbox1 i den? kan man gøre noget ved det?

min kode

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Threading;

namespace ItemBox
{
    delegate void myDelegate(string name);

    public class dataloader
    {
        myDelegate del1 = new myDelegate(Form1.AddItem);
        XmlDocument spawnfile = new XmlDocument();
        XmlDocument lootkeyfile = new XmlDocument();
        XmlDocument resourcefile = new XmlDocument();
        public void LoadXML()
        {
            spawnfile.Load("spawns.xml");
            lootkeyfile.Load("lootkeys.xml");
            resourcefile.Load("resources.xml");
            for (int i = 0; i < 100; i++)
            {
                del1("TEST");
                System.Threading.Thread.Sleep(100);
            }
        }
    }
    public partial class Form1 : Form
    {
        dataloader bw = new dataloader();
        Thread t;

        public Form1()
        {
            InitializeComponent();
            t = new Thread(new ThreadStart(bw.LoadXML));
        }

       
        //Load Knap
        private void button1_Click(object sender, EventArgs e)
        {
            //Start Background Worker
            if (t.IsAlive)
            {
                t.Abort();
            }
            else
            {
                t.Start();
            }
        }

        public static void AddItem(string name)
        {
          //  listBox1.Items.Add(name);
        }


formkode

namespace ItemBox
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (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.listBox1 = new System.Windows.Forms.ListBox();
            this.d = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // listBox1
            //
            this.listBox1.FormattingEnabled = true;
            this.listBox1.Location = new System.Drawing.Point(12, 12);
            this.listBox1.Name = "listBox1";
            this.listBox1.Size = new System.Drawing.Size(526, 472);
            this.listBox1.TabIndex = 0;
            //
            // d
            //
            this.d.Location = new System.Drawing.Point(463, 495);
            this.d.Name = "d";
            this.d.Size = new System.Drawing.Size(75, 23);
            this.d.TabIndex = 1;
            this.d.Text = "Load";
            this.d.UseVisualStyleBackColor = true;
            this.d.Click += new System.EventHandler(this.button1_Click);
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(550, 530);
            this.Controls.Add(this.d);
            this.Controls.Add(this.listBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.ListBox listBox1;
        private System.Windows.Forms.Button d;
    }
}
Avatar billede kalp Novice
08. oktober 2009 - 14:53 #1
gør din listbox static?
eller gør din metode til ikke static?

jeg kan ikke se hvad problemet er? :D

private static System.Windows.Forms.ListBox listBox1;
Avatar billede kalp Novice
08. oktober 2009 - 14:54 #2
skal siges jeg ikke har læst din kode - men det er nemt og lave det du prøver:)
Avatar billede Droa Seniormester
08. oktober 2009 - 15:11 #3
min delegate siger den skal være static..  jeg ved ikke hvorfor min delegate kræver en static
Avatar billede Droa Seniormester
08. oktober 2009 - 15:12 #4
Error    2    An object reference is required for the non-static field, method, or property 'ItemBox.Form1.AddItem(string)'

når jeg fjerner static fra min methode
Avatar billede bitmatic Nybegynder
08. oktober 2009 - 15:22 #5
@Kalp: LOL - Det er nok det dårligste svar jeg endnu har set her på Eksperten :-)


@mochners:
Her er lidt der måske kan få dig lidt videre:

public delegate void myDelegate(string name);

public class dataloader
{
    myDelegate del1;

    public dataloader(myDelegate callback)
    {
        del1 = callback;
    }
   
    public void LoadXML()
    {
        for (int i = 0; i < 100; i++)
        {
            del1("Test");
            System.Threading.Thread.Sleep(100);
        }
    }
}

public partial class Form1 : Form
{
    dataloader bw;
    Thread t;

    public Form1()
    {
        InitializeComponent();
        bw = new dataloader(new myDelegate(AddItem));
        ThreadStart ts = new ThreadStart(bw.LoadXML);
        t = new Thread(ts);
    }

   
    //Load Knap
    private void button1_Click(object sender, EventArgs e)
    {
        //Start Background Worker
        if (t.IsAlive)
        {
            t.Abort();
        }
        else
        {
            t.Start();
        }
    }

    public void AddItem(string name)
    {
        if (InvokeRequired)
        {
            Invoke(new myDelegate(AddItem), new object[] { name });
            return;
        }
      listBox1.Items.Add(name);
    }
}
Avatar billede kalp Novice
08. oktober 2009 - 19:42 #6
Bitmatic >> ligesom dit billede er det sjoveste jeg har set på Eksperten til dato:D!
Ps. mit svar er skam ikke forkert - man bestemmer selv om ens delegate eller variabler skal være static.

Jeg har ikke læst koden, men jeg kan da uden problemer få den til og fungere skal du se;)
Avatar billede kalp Novice
08. oktober 2009 - 20:15 #7
Mochners>> Her er din kode rettet som den f.eks kunne laves.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Threading;

namespace ItemBox{
    delegate void myDelegate(string name);

    public partial class Form1 : Form {
            dataloader bw;
            Thread t;

            public Form1() {
                InitializeComponent();
                bw = new dataloader(this);
                t = new Thread(new ThreadStart(bw.LoadXML));
            }


            //Load Knap
            private void button1_Click(object sender, EventArgs e) {
                //Start Background Worker
                if (t.IsAlive) {
                    t.Abort();
                }
                else {
                    t.Start();
                }
            }

            public void AddItem(string name) {
                if (this.InvokeRequired) {
                    Invoke(new myDelegate(AddItem), name);
                }
                else {
                    listBox1.Items.Add(name);
                }
            }

          internal class dataloader {
              myDelegate del1;
              public dataloader(Form1 form) {
                  del1 = new myDelegate(form.AddItem);
              }
                XmlDocument spawnfile = new XmlDocument();
                XmlDocument lootkeyfile = new XmlDocument();
                XmlDocument resourcefile = new XmlDocument();
                public void LoadXML() {
                    spawnfile.Load("spawns.xml");
                    lootkeyfile.Load("lootkeys.xml");
                    resourcefile.Load("resources.xml");
                    for (int i = 0; i < 100; i++) {
                        del1("TEST");
                        System.Threading.Thread.Sleep(100);
                    }
                }
          }
        }
    }
Avatar billede windcape Praktikant
10. oktober 2009 - 15:29 #8
kalp:

Static er en utrolig dårlig løsning til multi-threading. Man kunne også bare slå fra så den ikke checker om det er cross-thread UI invokes, begge dele er utrolig dårlige og enhver programmør over begynderstadiet bør vide bedre!
Avatar billede windcape Praktikant
10. oktober 2009 - 15:32 #9
Og et forslag til bitmatics kode:

(ja, jeg elsker lambda.)

public void AddItem(string name)
{
    Invoke(
        (Action)( () => listBox1.Items.Add(name); )
    );
}
Avatar billede windcape Praktikant
10. oktober 2009 - 15:34 #10
Og derudover er der et ReportProgress event in BackgroundWorker, så hele problemet kan løses uden egne threads og UI invokes!

Så ingen af overstående løsninger er optimale.
Avatar billede windcape Praktikant
10. oktober 2009 - 15:43 #11
Dirty example:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
       
        XmlDocument spawnfile    = new XmlDocument();
        XmlDocument lootkeyfile  = new XmlDocument();
        XmlDocument resourcefile = new XmlDocument();

        private void LoadXML()
        {
            spawnfile.Load("spawns.xml");
            backgroundWorker1.ReportProgress(0, spawnfile);
           
            lootkeyfile.Load("lootkeys.xml");
            backgroundWorker1.ReportProgress(0, lootkeyfile);

            resourcefile.Load("resources.xml");
            backgroundWorker1.ReportProgress(0, resourcefile);
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            LoadXML();
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            var doc = (e.UserState as XmlDocument);
       
            listBox1.Items.Add(doc.Name);
        }
    }
}
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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