vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

C# Ecke
Keine Möglichkeit zwischen zwei Klassen zu kommunizieren? 
Autor: Fabi99
Datum: 24.02.16 16:53

Hallo liebe Community,

ich arbeite gerade an einem Projekt mit einer Form und einer zweiten Klasse.

Die zweite Klasse befüllt über einen anderen Thread im Hintergrund eine List<Of T> und die Form soll diese, wenn der Thread fertig ist, bekommen. Diese Liste soll dann in einer ListView auf der Form visualisiert werden.

Ich frage mich aber, wie der Thread die Form benachrichtigen soll, wenn er fertig ist. Ich habe es bereits mit einer ganz normalen Void in der Form1.cs versucht, aber die muss dann ja static sein, damit die andere Klasse sie überhaupt aufrufen kann. Dann kann ich aber logischerweise die ListView nicht mehr erreichen.

Bin ein Umsteiger von VB.NET auf C# und dieses Problem gab es da mit Modulen ja nicht, da mussten die Subs nicht Shared (static) gemacht werden, um sie von woanders aufzurufen.

Kann mir da vielleicht jemand helfen?

Vielen Dank im Voraus.

Gruß

Fabi99
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Keine Möglichkeit zwischen zwei Klassen zu kommunizieren? 
Autor: Manfred X
Datum: 24.02.16 19:01

Hallo!

Wenn der Thread in der unterg. Klasse beendet ist, wird dort ein
entsprechendes Ereignis ausgelöst.
Die Form muß eine Instanz der unterg. Klasse deklarieren und einen
Eventhandler für dieses Ereignis.
Wird das Ereignis ausgelöst (Eventhandler), kann im Formular die Datenbindung
an die (öffentliche) Liste in der untergeordneten Klasse erfolgen (per Invoke).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
 
    public class frmBack : System.Windows.Forms.Form
    {
        private bool InstanceFieldsInitialized = false;
 
        public frmBack()
        {
            if (!InstanceFieldsInitialized)
            {
                InitializeInstanceFields();
                InstanceFieldsInitialized = true;
            }
            SubscribeToEvents();
        }
 
        private void InitializeInstanceFields()
        {
            btnstart = new Button
            {
                Parent = this,
                Text = "Start"
            };
            lbo = new ListBox
            {
                Parent = this,
                Top = 50
            };
        }
 
 
        //Interne Klasse
        private class Back
        {
 
            //Öffentliche Liste          
            public List<string> lst = new List<string>();
            public delegate void FilledEventHandler();
 
            //Melde-Ereignis
            public event FilledEventHandler Filled;
 
 
            //Öffentliche Methode: Liste füllen
            public void fill()
            {
                System.Threading.Thread th = new System.Threading.Thread(iFill);
                //Füllender Thread
                th.Start();
            }
 
            //Interne Methode
            private void iFill()
            {
                lst.Clear();
                for (int i = 0; i <= 10; i++)
                {
                    lst.Add("Item" + i.ToString());
                }
                if (Filled != null)
                    Filled();
            }
        } //Back-Klasse
 
 
        //Controls in der Hauptform
        private Button btnstart;
        private ListBox lbo;
 
        //Instanz der internen Klasse
        private Back bck = new Back();
 
 
        //Click-Eventhandler
        private void btnstart_Click(object sender, System.EventArgs e)
        {
 
            lbo.DataSource = null;
            bck.fill();
        }
 
 
        //Filled-Eventhandker (von bck ausgelöstes Event)
        private void bck_Filled()
        {
            //Invoke: ZUgriff auf Control aus anderem Thread
            this.Invoke(new MethodInvoker(BindList));
        }
 
 
        private void BindList()
        {
            lbo.DataSource = bck.lst;
        }
 
 
        //Event handler
        private bool EventsSubscribed = false;
        private void SubscribeToEvents()
        {
            if (EventsSubscribed)
                return;
            else
                EventsSubscribed = true;
 
            btnstart.Click += btnstart_Click;
            bck.Filled += bck_Filled;
        }
 
 
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // frmBack
            // 
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Name = "frmBack";
            this.Load += new System.EventHandler(this.frmBack_Load);
            this.ResumeLayout(false);
 
        }
 
 
        private void frmBack_Load(object sender, EventArgs e)
        {
            //formal
        }
 
    } //Formular
}//Namespace
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel