Autor Beitrag
DrHoas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Fr 11.12.15 14:47 
Hallo,

ich habe eine ComboBox und ein "_SelectedIndexChanged-Event". Die Klasse "Form1 : Form" ist eh partial, also wollte ich etwas Struktur reinbringen und Events in die Datei "Events.cs" auslagern. Prinzipiell funktioniert das auch. Allerdings wird mir manchmal ein zweites "_SelectedIndexChanged-Event" automatisch in "Form1.cs" erstellt und dann meckert der Compiler natürlich.
Ich denke, das liegt an der Zeile

ausblenden C#-Quelltext
1:
this.cbSpezies.SelectedIndexChanged += new System.EventHandler(this.cbSpezies_SelectedIndexChanged);					

aber ohne die läuft's halt gar ned.

Kann man da was machen?

Dank und Gruß

Philipp
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 11.12.15 15:09 
Du kannst belibieg viele EventHandler haben und die jeweils belibieg oft an den Event hängen.

Was nicht sein darf ist das die EventHandler gleich heißen (gleiche Methodenname ist nicht). Aber du hast uns ja nicht verraten worüber der Compiler meckert. Er spricht ja eigentlich sehr konkret mit einem und sagt nicht nur nö ;)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 11.12.15 17:39 
Hallo DrHoas,

wenn du mit dem Designer arbeitest, würde ich davon abraten, die Forms-Klasse in weitere partielle Klassen aufzusplitten.
Was du machen kannst (und solltest) ist interne Logik-Klassen erstellen, welche dann von den Event-Methoden benutzt werden:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
private MyLogic _logic = new MyLogic();

private void cbSpezies_SelectedIndexChanged(object sender, EventArgs e)
{
  logic.DoSomethingWithSelectedItem(cbSpezies.SelectedItem);
}

Direkte GUI-Aktivitäten sollten aber in der Forms-Klasse stattfinden.

Wenn du zuviele Elemente auf der Form hast, dann kannst du dafür Benutzersteuerelemente (UserControls) erstellen, welche dann wiederum mit einem eigenen Designer + Code bearbeitet werden können. Und die Form benutzt dann diese UserControls (wie normale andere Elemente).
DrHoas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Sa 12.12.15 08:57 
Ja genau, ich arbeite mit dem Designer und werde es wohl so machen, wie von Th69 vorgeschlagen.

Trotzdem nochmal eine Beschreibung des Fehlers, denn für mich ist das ein Bug von VisualStudio (wenn schon partial, dann bitte richtig):
Ich erstelle im Eigenschaftenfenster unter Ereignisse das SelectedIndexChanged-Event. Es wird automatisch in Form1.cs erstellt. Dort schneide ich es aus und steck es in meine Datei Events.cs. Das Ganze funktioniert einwandfrei aber irgendwann, mir ist nicht ganz klar, wann genau, wird in Form1.cs nochmal eine SelectedIndexChanged-Event mit identischem Namen erstellt. Der Compiler meldet dann
Zitat:
Fehler 1 Der Aufruf unterscheidet nicht eindeutig zwischen folgenden Methoden und Eigenschaften:
"HG.Form1.cbSpezies_SelectedIndexChanged(object, System.EventArgs)" und
"HG.Form1.cbSpezies_SelectedIndexChanged(object, System.EventArgs)"

Grüße

Philipp
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 12.12.15 14:06 
Der VS-Designer benutzt die zur .designer.cs-Datei passende Forms-Datei um dann die fehlenden Ereignishandler zu generieren. In der Projektdatei sind diese beiden Dateien miteinander verlinkt:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
<Compile Include="MainForm.cs">
    <SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
    <DependentUpon>MainForm.cs</DependentUpon>
</Compile>

Deine eigene Datei "Events.cs" kennt der VS-Designer einfach nicht (du könntest zwar jetzt die Projektdatei ändern, aber davon würde ich abraten, wenn du nicht genau weißt, wie du evtl. Fehler dann wieder ausbügeln kannst).

PS: Mit dem Schlüsselwort partial hat dies also wenig zu tun (dies ist nur eine zwingend notwendige Unterstützung für den Compiler).