C# - Eintrag in ListView über andere Form


fletschge

Grünschnabel
Hi
Ja ich weiss, über Themen wie dieses gibt es tausende Beiträge, die haben mir jedoch nicht geholfen.
Ich bin völliger C# (hab vorher mit VB6 geproggt und keine Ahnung von Objektorientierter Programmierung).
Ich hab ne Hauptform, auf der eine ListView platziert ist.
Per Button rufe ich eine zweite Form auf auf der ein Button ist.
Wenn ich auf diesen Button auf der zweiten Form klicke, soll ein Eintrag in die Listview der ersten Form (geöffnet) geschrieben werden.
Wie geht das? Die Controls kan nich ja leider nicht direkt ansprechen.

Bitte noch eine kurze Erklärung warum :( :( :( :( :(
 

Norbert Eder

Erfahrenes Mitglied
Erstell einfach eine public Methode in der ersten Form die du AddListViewEntry(ListViewItem item) an die du ein fertiges ListViewItem übergibst.

Du brauchst noch eine private Variable für die Form1 in der Form2 und den Konstruktor der zweiten Form änderst du einfach so:
Code:
private Form1 form1 = null;

public Form2(Form1 f1) {
  form1 = f1;
}
Nun kannst du per
Code:
this.form1.AddListViewEntry(myListViewItem);
ein Item an die ListView anfügen.
 

Christian Kusmanow

Erfahrenes Mitglied
fletschge hat gesagt.:
hab vorher mit VB6 geproggt und keine Ahnung von Objektorientierter Programmierung
Dann machs doch gleich Objektorientiert und übergib das Interface des Form1 dem Form2 im Konstruktor.
Danach kannst Du einfach auf alle im Interface definierten Methoden und Objekte zugreifen.

MfG, cosmo
 

fletschge

Grünschnabel
Danke für die schnellen Antworten!

@ cosmochaosmaker

wie gesagt, ich habe keine Ahnung davon :confused:

Wie übergeb ich denn das Interface dem Konstruktor *n oobfrage*
 
Zuletzt bearbeitet:

Norbert Eder

Erfahrenes Mitglied
Und was soll ihm das Interface bringen, mal davon abgesehen, dass es nur vom ContainerControl ein Interface (IContainerControl) gibt, die Form ist dann wieder eine Ableitung von ContainerControl und erweitert dieses.

Davon abgesehen: Durch die Übergabe des Interfaces kann er nicht auf selbst erstellte Properties zugreifen. Er könnte höchstens über die Controls-Collection auf die einzelnen Controls zugreifen, was aber wiederum nicht sauber wäre.
 

fletschge

Grünschnabel
Danke Norbert =)

Schon ein Stückchen weiter.

Nur ist bei mir noch das Problem dass über mein Code nur funktioniert, wenn ich die Form als neue Instanz aufrufe (dort ist der Eintrag dann vorhanden). Jedoch ist meine Hauptofrm bereits geöffnet. Was mache ich falsch?

Form1:

Code:
public void AddListViewEntry(string item)
{
    ListView.Items.Add(item);
}
Form 2:

Code:
private void cmdSave_Click(object sender, EventArgs e)
{
    frmMain frmTemp = new frmMain();
    frmTemp.Show();
    frmTemp.AddListViewEntry("TestEintrag");
        }
 

Christian Kusmanow

Erfahrenes Mitglied
fletschge hat gesagt.:
Was mache ich falsch?
Du instanzierst ein völlig neues Form was demnach nicht die veränderten Werte hat.
Sowieso wird es nach beenden des Events verworfen.
Norbert meinte es aber so:
Code:
class Form2{
	private Form1 form1 = null;

	public Form2(Form1 f1) {
		form1 = f1;
	}
	private void cmdSave_Click(object sender, EventArgs e) {
		form1.AddListViewEntry("TestEintrag");
	}
}
Norbert Eder hat gesagt.:
Durch die Übergabe des Interfaces kann er nicht auf selbst erstellte Properties zugreifen.
Sorry Norbert, aber ich verstehe das nicht ganz.
Warum klappt das dann bei mir tadellos?
Code:
interface IMainForm{
	string StatusBarText{
		get
		set;
	}
}
class frmMainForm : Form, IMainForm{
	private StausBar sbrStatus;

	public string StatusBarText{ // selbsterstelltes Property
		get{ return sbrStatus.Text; }
		set{ sbrStatus.Text = value; }
	}
}
class frmSetStatus{
	private IMainForm MainForm;
	public frmSetStatus( IMainForm Form ){
		MainForm = Form;
	}
	private void SetStatus(){
		MainForm.StatusBarText = "Geht doch ;)";
	}
}
Klär mich doch bitte auf Norbert, wenn Du jetzt was anderes meinst.
 

Norbert Eder

Erfahrenes Mitglied
Du musst die erste Form beim Aufruf der zweiten Form mitübergeben. Hab ich dir eh schon geschrieben wie das machen kannst.

Aufrufen tust die zweite Form dann so:
Code:
Form2 form2 = new Form2(this);
form2.Show();
 

Norbert Eder

Erfahrenes Mitglied
cosmochaosmaker hat gesagt.:
Klär mich doch bitte auf Norbert, wenn Du jetzt was anderes meinst.
Ganz einfach, du hast dir selbst ein Interface gebaut. Du hast aber geschrieben, er soll das Interface der Form übergeben - da steht aber nirgends etwas von "selbst ein Interface erstellen". Und as konnte ich daher auch nicht wissen.

Ein eigenes Interface für deine Form zu bauen ist übrigens ein Overhead, es reicht, wenn du eine Reference auf deine Form weitergibst (dann hast auch nur eine Instanz). Schlüsselwort -> ref
 

fletschge

Grünschnabel
cool thx Norbert!

Sorry ich wusste schon dass du das geschrieben hast, erschien mir aber zu wenig wichtig *besserhörwasanderesagen* :)
 

Christian Kusmanow

Erfahrenes Mitglied
Norbert Eder hat gesagt.:
Ganz einfach, du hast dir selbst ein Interface gebaut. Du hast aber geschrieben, er soll das Interface der Form übergeben - da steht aber nirgends etwas von "selbst ein Interface erstellen". Und as konnte ich daher auch nicht wissen.
Ohh, sorry fletschge. Hab mich erst falsch ausgedrückt.
Norbert Eder hat gesagt.:
Ein eigenes Interface für deine Form zu bauen ist übrigens ein Overhead, es reicht, wenn du eine Reference auf deine Form weitergibst (dann hast auch nur eine Instanz). Schlüsselwort -> ref
Warum ist es denn ein Overhead? Versteh ich nicht.
Kannst Du mir das bitte nahebringen oder auf eine Lektüre dazu verweisen.
Ich dächt ein Interface ist eine saubere Objektorientierte Lösung um auf Objekte/Methoden,
innerhalb eines andres Objektes zugreifen zu können. :confused:
 

Norbert Eder

Erfahrenes Mitglied
Sicher ist es eine saubere Variante - keine Frage. Meiner Meinung machen Interfaces aber hauptsächlich dann Sinn, wenn ich eine externe Schnittstelle bereitstellen will. Ich selbst weiß ja wie ich meine Klassen zu verwenden habe bzw. wie diese auszusehen haben. Andere wissen es nicht und müssen daher über das Interface darauf aufmerksam gemacht werden. Dies verhält sich natürlich auch so, wenn im Team gearbeitet wird, in dem jeder seinen abgeschlossenen Bereich hat und mit den Modulen der anderen zu arbeiten hat.

Erstellst du ein Projekt alleine und auch noch ohne externe Schnittstellen (zB Plugins) machts wenig Sinn, sondern vergrößert einfach nur deinen persönlichen Overhead. So wars gemeint.
 

Christian Kusmanow

Erfahrenes Mitglied
Vielen dank für die Antwort Norbert!

Jetzt verstehe ich wie Du das gemeint hast.
Ich für mich finde mit Interfaces kann man bei großen Modularen Projekten gewisse Zugriffsbereiche
einfach trennen und machen die Handhabung trotz Mehraufwand, wie ich nun weiss,
für mich aber trotzdem überschaubarer,
obwohl ich ausschließlich allein programmiere aber WebServices im Team verwirkliche.
Denke aber auch wenns ein kleines Projekt ist, isses echt ein persönlicher Overhead.
 

Norbert Eder

Erfahrenes Mitglied
Eine allgemeingültige Lösung hierfür gibt es nicht. Im Endeffekt kann man alles hinter einer "Designentscheidung" verstecken. Man muss selbst abwägen wann die Verwendung von Interfaces Sinn macht und wann nicht. Vieles ist auch Erfahrung.
 

Neue Beiträge