| |
C# EckeKeine 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 | |
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 | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|
|
|
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
|
|