Autor |
Beitrag |
Square
Hält's aus hier
Beiträge: 7
Win XP, Win 7, ArchLinux
VS C# 2010 Express
|
Verfasst: Di 19.07.11 00:37
Guten Morgen,
Ich habe ein kleines Problem beim ansprechen einer ListView von einer 2.en Form aus.
in der MainForm befindet sich die LV, diese möchte ich über eine 2.te mit Einträgen befüllen. Hierzu habe ich eine globale Variable erstellt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public static mng Mng_alt { get; private set; } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Mng_alt = new mng(); Application.Run(new mng()); } |
und innerhalb der 2.en Form:
C#-Quelltext 1: 2: 3: 4: 5:
| private void bT_Add_Click(object sender, EventArgs e) { Program.Mng_alt .lw_Accounts.Items.Add(new ListViewItem(new String[] {"tB_Nick.Text", "tB_Pass.Text", "tB_Mail.Text"})); } |
Keinerlei Fehlermeldungen erhalten, der selbe Code in Form1 bringt auch nichts.
Lediglich (in Form1, da wo ich das ja nicht brauche) ohne die "globale" Variable, also:
C#-Quelltext 1:
| lw_Accounts.Items.Add(new ListViewItem(new String[] {"tB_Nick.Text", "tB_Pass.Text", "tB_Mail.Text"})); |
Jetzt die Frage: Was habe ich bisher übersehen?
//E:
Huch, Nichtmal Threadübergreifend kann ich arbeiten oO
Selbe Form, allerdings:
Zitat: | Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lw_Accounts erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde. |
Ich vermute das die Lösung beider Probleme die gleiche ist, sie direkt vor mir liegt, aber ich sie einfach nicht sehe.
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 19.07.11 10:08
Hallo Square
dazu habe ich einen Artikel unter Kommunikation von 2 Forms verfasst.
Kurzfassung:
- keine Verwendung von statischen Variablen
- untergeordnete Forms sollten nicht auf übergeordnete (aufrufende) Forms zugreifen (und erst recht nicht direkt auf enthaltene Controls, sondern wenn über Eigenschaften bzw. Methoden)
- Lösung: Verwendung eines selbstdefinierten Ereignisses
Und bzgl. des thread-übergreifenden Vorgangs:
Nur der Haupt-GUI-Thread darf GUI-Elemente erstellen bzw. darauf zugreifen (da WinForms bzw. die darunterliegende WinAPI single-threaded arbeitet). Die Lösung besteht darin, mittels der Control.Invoke-Methode den Code im GUI-Thread ausführen zu lassen. Forms dürfen also nie in einem Nebenthread erzeugt werden bzw. darin laufen!
Für diesen Beitrag haben gedankt: Square
|
|
Square 
Hält's aus hier
Beiträge: 7
Win XP, Win 7, ArchLinux
VS C# 2010 Express
|
Verfasst: Di 19.07.11 19:01
Vielen Dank, ich hab das Thread Problem gelöst, lediglich die ListView will noch nicht so ganz wie ich :/
Nun, ich werde mich damit noch weiter auseinandersetzen und falls ich dann immer noch auf keinen grünen Zweig komme kann ich mich ja hier noch einmal melden 
|
|
Square 
Hält's aus hier
Beiträge: 7
Win XP, Win 7, ArchLinux
VS C# 2010 Express
|
Verfasst: Mi 20.07.11 19:08
Okay...
Ich kapituliere^^
HAbe mich den ganzen Tag nun mit den Events beschäftigt, einzelne Strings bekomme ich durch die 2te Form auch problemlos auf die erste, allerdings nicht in die listview...
Ich muss mehrere Felder füllen, brauche also ein Array, wie bekomme ich nun dieses Array:
C#-Quelltext 1:
| lw_Accounts.Items.Add(new ListViewItem(new String[] { tB_Nick, tB_Pass, tB_Mail})); |
in diese listView?? Ich verzweifle daran... Ich glaube sie hasst mich einfach
Habe mich auch durch endlos viele andere FAQ's und die MSDN Library gewühlt, aber bin daraus einfach nicht schlau geworden. Überall wird nur erklärt wie ich einen einzigen festen Text auf die MainForm bekomme...
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 20.07.11 20:12
Hallo Square,
hast du denn jetzt schon ein Ereignis innerhalb der 2. Form definiert (wie in meinem Artikel beschrieben)?
Du kannst direkt mein Beispiel (unter "2. Ereignisse") übernehmen - einzige Änderung ist dann, daß du anstatt "string" ein String-Array "string[]" verwenden mußt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public class TextsEventArgs : EventArgs { public TextEventArgs(string[] texts) { Texts = texts; }
public string[] Texts { get; set; } } |
(ich habe analog dazu jetzt den oberen Code so verändert, daß überall die Mehrzahl "Texts" verwendet wird)
Und Aufrufen kannst du dann das Ereignis, indem du dann dein String-Array übergibst:
C#-Quelltext 1: 2:
| string[] texts = new string[] { "A", "B", "C" }; OnUpdateTexts(new TextsEventArgs(texts)); |
(du kannst dann diese Methode selbstverständlich auch "OnAddTexts" o.ä. nennen)
Für diesen Beitrag haben gedankt: Square
|
|
Square 
Hält's aus hier
Beiträge: 7
Win XP, Win 7, ArchLinux
VS C# 2010 Express
|
Verfasst: Mi 20.07.11 22:04
Viele Dank hierfür, aber ich glaube ich bin einfach zu dämlich :'D
Bin schon wieder kurz vor nem Tobsuchtsanfall
Der gesendete Text geht irgendwo unter... MainForm ist aboniert, aber selbst wenn ich als ergebisse ne MessageBox (um zu sehen ob überhaupt irgendetwas bei Form1 ankommt) auslöse kommt diese ebenso wenig...
In der 2ten Form (AddNick)
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| public class AddNickArgs : EventArgs { public AddNickArgs(string[] nicktoadd) { NickToAdd = nicktoadd; }
public string[] NickToAdd { get; set; } }
public event EventHandler<AddNickArgs> AddNickToList; void button1_Click(object sender, EventArgs e) { if (tB_Mail.Text == "") { tB_Mail.Text = ("-"); } string[] InsertedAccs = new string[] { "Test Nickname Feld", "Test Passwortfeld", "Test E-Mail"}; OnFinishedNick(new AddNickArgs(InsertedAccs)); }
protected virtual void OnFinishedNick(AddNickArgs e) { EventHandler<AddNickArgs> evad = AddNickToList; if (evad != null) evad(this, e); } |
In der MainForm:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| void button1_Click(object sender, EventArgs e) { AddNick addnick = new AddNick(); addnick.AddNickToList += AddNickToDamnList; addnick.ShowDialog(this); }
void AddNickToDamnList(object sender, AddNick.AddNickArgs e) { this.lw_Nicks.Invoke((MethodInvoker)delegate() { lw_Nicks.Items.Add(new ListViewItem(e.NickToAdd)); }); } |
Kann doch nich sein das ich so Dumm bin und das nicht auf die Reihe zu bekommen obwohl du mir sogar den Code "diktiert" hast...
Ich hatte noch nie _so_ nen hänger an egal welchem Part beim Coden...
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 21.07.11 11:07
Hallo Square,
hast du denn schon mal den Debugger benutzt (Haltepunkt setzen und per F10/F11 weitersteppen), um zu sehen ob das Ereignis ausgeführt wird bzw. ob die Ereignismethode AddNickToDamnList überhaupt ausgeführt wird?
Das einzige, das mir auf Anhieb auffällt, ist, daß die Invoke-Methode überflüssig ist (da du ja sowieso im GUI-Thread bist):
C#-Quelltext 1: 2: 3: 4:
| void AddNickToDamnList(object sender, AddNick.AddNickArgs e) { lw_Nicks.Items.Add(new ListViewItem(e.NickToAdd)); } |
|
|
Square 
Hält's aus hier
Beiträge: 7
Win XP, Win 7, ArchLinux
VS C# 2010 Express
|
Verfasst: Do 21.07.11 14:56
Also, ausgeführt wird auf der Form AddNick alles richtig, im Array liegen alle daten, aber sobald er prüft ob evad null ist, ist es null...
Er springt also ohne das Array zu füllen einmal nach dem button1_click zu OnFinishedNick, hier ist evad null und er springt zurück auf button1_click, dann befüült er die drei werte im array aber es kommt auf der MainForm nichts an und er stoppt :/
ein paradoxon^^
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 21.07.11 15:26
Hallo square,
das ist eigenartig, denn natürlich sollte 'evad' dann ungleich null sein und die abonnierte Methode ausführen.
Hast du vllt. irgendwo in deiner AddNick-Klasse ein "AddNickToList = null" hingeschrieben? Oder aber arbeitest du mit einer falschen AddNick-Instanz, obwohl ich an:
C#-Quelltext 1: 2: 3:
| AddNick addnick = new AddNick(); addnick.AddNickToList += AddNickToDamnList; addnick.ShowDialog(this); |
keinen Fehler erkennen kann.
Oder arbeitest du immer noch mit mehreren Threads (das zumindestens hierfür nicht sinnvoll ist)?
Evtl. laß auch mal dein Projekt komplett neu erstellen (compilieren).
|
|
Square 
Hält's aus hier
Beiträge: 7
Win XP, Win 7, ArchLinux
VS C# 2010 Express
|
Verfasst: Fr 22.07.11 15:56
Also, habe alles nochmal überprüft, den Code komplett auf den Kopf gestellt, und nichts finden können... Dann hab ich nachgesehen obs mit dem Projekt erstellen funktioniert und ... es hat geklappt
Ich habe keine ahnung warums auf einmal klappt... aber ich bedanke mich auf jeden fall bei dir für deine Hilfe, ohne dich hät ichs wohl nicht hinbekommen! 
|
|
|