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 :( :( :( :( :(
 
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.
 
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
 
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:
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.
 
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");
        }
 
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.
 
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();
 
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
 
cool thx Norbert!

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