Hallo Leute,
(allein der Themenname ist schon eine Qual)
gestern Abend saß ich schon am PC um meine Frage zu formulieren. Nach langem Rumprobieren und Lesen, bin ich leider immer noch nicht weiter. Um euch nicht groß zu verwirren, werde ich nciht viel schreiben, sondern eher stichpunktartik festhalten was das Ziel ist und wie die bisherige Struktur aussieht.
Wozu brauche ich eure Hilfe?
a) Ersteinmal ob dieser Weg der richtige/beste Weg ist
aa) beim Helfen einer Lösung
Ich nehme auch Bezug auf diesen Thread, der mir viel geholfen hat, aber ich leider nicht genau weiß wie ich das auf mein Problem umsetzen soll.
Problem mit EventHandler
Struktur:
frmMain beinhaltet ein TreeView und ein Panel. In diesem Panel werden UserControls angezeigt, über das TreeView.AfterSelect-Event.
Dann gibt es eine Klasse (MyClass) mit einer Methode AddValue (Werte in Array einfügen) und einer Methode Create (Array schreiben).
Was ich jetzt möchte ist, dass ich in jedem UserControl mehrmals die Methode AddValue aufrufen kann. Problem dabei ist, dass ich kein Event habe wo ich diese Methoden ausführen kann.
Ich nehme also an, dass ich ein neues Event in jedem UserControl erstellen muss, worin dann die AddValue-Methoden ausgeführet werden können. Soweit so gut.
Also Problem stellt sich mir jetzt:
Wie sage ich beim AfterSelect-Event -> führe UserControl-Event aus (sprich es muss bei jedem Wechsel das jeweilige Event des UserControls aufgerufen werden).
Die Methode Create soll von einem Abschluss-UserControl ausgeführt werden. Wie aber stelle ich es an, dass alle aufgerufenen AddValues nun zusammengefasst werden?! Ich hatte mir gedacht nur in frmMain die Klasse (MyClass) zu instanzieren und irgendwie den Inhalt nun von den UserControls dorthin zu übertragen.
Also ich hoffe ihr habt mich einigermaßen verstanden. Viel weiter war ich gestern auch nicht. Bin sehr schlecht im Erklären von Problemen, aber ich versuche euch das irgendwie rüberzubringen...
Hallo -acid-,
a) Ersteinmal ob dieser Weg der richtige/beste Weg ist
Ich denke nicht.
aa) beim Helfen einer Lösung
Gerne, allerdings ist mir das Problem noch nicht ganz klar.
Ist MyClass die Klasse der UserControls oder eine andere? Wenn letzteres: was repräsentiert diese Klasse? Klassen sollten immer für Substantive (Dinge) stehen, nicht für Verben (Aktionen).
Wie sage ich beim AfterSelect-Event -> führe UserControl-Event aus
Warum musst du das tun? Du hast doch schon den EventHandler für das AfterSelect. Tu doch da, was zu tun ist.
Grundsätzlich wird ein Event von dem jeweiligen Objekt selbst gefeuert. Also in einer Methode des Objekts. Dazu muss natürlich eine Methode des Objekts ausgeführt werden. Zu sehen ist das in meinem zweiten Code-Beipiel in Problem mit EventHandler (Methode: DoSomething).
Die Methode Create soll von einem Abschluss-UserControl ausgeführt werden.
Wann genau soll das passieren? Und welche vorhandenen Events werden zu diesem Zeitpunkt gefeuert? Wenn es einen solchen Event gibt, tu was zu tun ist in dem entsprechenden EventHandler.
herbivore
Hallo herbivore - Helfer der Helfer 🙂
MyClass war lediglich eine Vereinfachung für die User hier. Was ich damit sagen wollte ist einfach nur, dass diese Klasse zwei Methoden hat die von den UserControls aufgerufen werden sollen. Eine Methode schreibt Werte in ein Array die andre schreibt das Array in ein File.
Die angezeigten UserControls (im MainPanel) haben Inputfelder. Diese Felder sollen beim Wechsel zu einem anderen UserControl über AddValue in dem Array gespeichert werden. Der Wechsel erfolgt über den festgestellten Index im TreeView-AfterSelect-Event.
Das Hauptproblem ist, dass ich gerne AddValue in den einzelnen UserControls aufrufen möchte also sprich AddValue(this.textbox1.text), dies dann in das Array geschrieben wird ich aber nicht weiß, wie ich beim TreeView-AfterSelect-Event dem eben weggeklickten UserControl sage, ruf deine AddValue Methoden auf, anschließend das neue UserControl angezeigt wird und das das Abschließen-UserControl dann per Buttonklick die Methode Create aufruft und die Daten aller eben eingetragenen Werte schreibt.
Hier mal mein Pseudocode:
frmMain beinhaltet TreeView + MainPanel -> AfterSelect in TreeView zeige UserControlXY in MainPanel an.
Wenn durch AfterSelect das UserControl gewechselt wird, schreibe ruf aber vorher die Klassenmethode AddValue auf, damit die Inputwerte im Array drin sind.
Das gilt dann für alle UserControls.
Klickt man nun auf das letzte UserControl gibt es dort einen Button der Create aufrufen soll. und dort das Array - was aus allen UserControls erstellt wurde - schreibt. In den UserControls mache ich immer public Klassentyp Klassenname und greife dann mit Klassenname.AddValue auf die Methode zu. Wie bekomme ich aber alle geschriebenen Werte zu einer Klasse. Da muss ich irgendwie in der frmMain alles zusammenpacken...
Hallo -acid-,
- MyClass war lediglich eine Vereinfachung für die User hier. Was ich damit sagen wollte ist einfach nur, dass diese Klasse zwei Methoden hat die von den UserControls aufgerufen werden sollen. Eine Methode schreibt Werte in ein Array die andre schreibt das Array in ein File.
Eine Klasse sollte nicht durch ihre Methoden motiviert sein, sondern durch ihre Daten.
- Die angezeigten UserControls (im MainPanel) haben Inputfelder. Diese Felder sollen beim Wechsel zu einem anderen UserControl über AddValue in dem Array gespeichert werden. Der Wechsel erfolgt über den festgestellten Index im TreeView-AfterSelect-Event.
Dann brauchen die UserControls einfach eine Methode die das tut. Diese Methode rufst du dann im TreeView-AfterSelect-EventHandler auf.
Ich denke diese beiden Ratschläge zusammen, sollten das Problem lösen.
herbivore
Hallo, ich nehme mal Anschluss an die Antwort von herbivore.
Das Form sollte eine MyClass-Instanz besitzen.
Deine UserControls solltest du einfach um eine Methode erweitern, die
Values an ein Objekt vom Typ MyClass anhängt, das im Parameter
übergeben wird.
Z.Bsp. so:
public class MyUserControl : UserControl
{
public void AddValues(MyClass myClass)
{
myClass.AddValue(textBox1.Text);
myClass.AddValue(textBox2.Text);
}
}
Somit hast du auch eine saubere Trennung und benötigst eigentlich keine weiteren Events.
Hm ja ich habs schon befürchtet. Ich kann das nciht richtig erklären. Versuchen wir uns ranzutasten.
Habe jetzt eine Methode geschrieben wie vorgeschlagen:
public void AddValues(MyClass myClass)
{
myClass.AddValue(textBox1.Text);
myClass.AddValue(textBox2.Text);
}
Und von der MainForm aufgerufen. Wenn ich jetzt ReadData() mache, was mir das Array ausgeben soll, ist es nicht erweitert worden. Sehe ich das richtig, dass ich nun einen Rückgabewert von Typ MyClass machen muss und im AfterSelect-Event myClass = AddValues(myClass); machen muss?
Hallo -acid-,
nein, du brauchst keinen Rückgabewert. Wenn du myClass an AddValues übergibst,ist das eine Referenz auf das Objekt. Durch myClass.AddValue wird eben dieses Objekt verändert (zumindest, wenn die MyClass.AddValue-Methode richtig implementiert ist). Wenn du myClass dann an ReadData übergibst, sollten dort alle Informationen vorhanden sein.
herbivore
...und genau das ist nicht der Fall sonst hätte ich nicht gefragt. Hier der Code:
// UserControl
public class MyControl : UserControl
{
// Dient dazu um in der Klasse auf enums zugreifen zu können
public MyClass myClass;
public void AddValues(MyClass myClass1)
{
myClass1.AddValue(myClass.Params....., "myVlaue");
}
}
// frmMain
private TreeNode tmpNode;
private MyClass myClass = new MyClass();
private MyControl myControl = new MyControl();
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode Node = this.treeView1.SelectedNode;
if (tmpNode != null)
{
switch (tmpNode.Name)
{
case "node1":
myControl.AddValue(myClass);
break;
}
switch (Node.Name)
{
case "node1":
myControl.BringToFront();
break;
}
tmpNode = Node;
}
}
So die zwei Switch's dienen dazu um Node anzuzeigen im Panel (switch2) und um zu prüfen, was das letzte UserControl war (switch1), damit ich beim ausblenden "save" (AddValues) von dem jeweiligen UserControl machen kann.
Hallo -acid-,
du hast mehrere Instanzen von myClass. Ich vermute, dass das das Problem ist.
herbivore
Wenn das nicht so ist, kann ich nicht auf meine enums in der Klasse zugreifen. Wie umgehe ich das?
Du könntest das Enum als statisch deklarieren und über den Klassennamen drauf zugreifen.
Oder du definierst die Enums ausserhalb der Klasse.
*autsch* ja statisch, klar. Mann manchmal vergesse ich ganz grundliegende Sachen. Da trifft es der Spruch, dass man manchmal den Wald vor lauter Bäumen nicht sieht. Danke erstmal werde es heute Abend ausprobieren.
Nochmal ne kleine Extrafrage:
Ihr habt doch sicherliche mein AfterSelect-Event mit den switch's gesehen. Hoffe ihr habt das auch verstanden... mir kommt das etwas unsauber vor. Ideen wie man das besser machen könnte?
Hallo acid!
mir kommt das etwas unsauber vor. Ideen wie man das besser machen könnte?
Naja unsauber ist ein hartes Wort, denn funktional tut es das was es soll, nehme ich mal zumindest an.
Aber Du hast Recht. Eine Switch-Anweiswung mit nur einem case und ohne default ist ein wenig oversized.
Da reicht auch eine einfache if-abfrage:
if (tmpNode != null)
{
if (tmpNode.Name == node1)
myControl.AddValue(myClass);
if (Node.Name == node1)
myControl.BringToFront();
tmpNode = Node;
Das ist aber wahrscheinlich n ur Kosmetik, ich denke der Compiler optimiet den Code eh, zumindest wenn der Parameter aktiviert ist.
Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
norman_timo danke. In den switch's steht natürlich noch mehr drin sprich soviele Anweisungen wie UserControls die für mich ja als Seiten für das MainPanel gelten. Daher macht switch schon Sinn. Ich hatte nur versucht das irgendwie in eine zu packen oder das irgendwie etwas umzumodelieren.
Hallo -acid-,
Ideen wie man das besser machen könnte?
dazu müsste man erstmal wissen, wie die anderen cases aussehen. Wenn die Anweisungen immer gleich sind und sich nur auf unterschiedliche Objekte beziehen, dann kann und sollte man sich das switch tatsächlich sparen. Stattdessen kann man die benötigten Objekte direkt oder indirekt in TreeNode.Tag speichern und dann entsprechend verwenden.
herbivore
switch (tmpNode.Name)
{
case "node1":
myControl1.AddValue(myClass);
break;
case "node2":
myControl2.AddValue(myClass);
break;
case "node3":
myControl3.AddValue(myClass);
break;
...
}
switch (Node.Name)
{
case "node1":
myControl1.BringToFront();
break;
case "node2":
myControl2.BringToFront();
break;
case "node3":
myControl3.BringToFront();
break;
...
}
Ihr sehr es ist immer die gleiche Struktur. Das erste Switch um festzustellen welches weggeklickt wurde um die Eingaben zu speichern, das zweite Switch um es anzuzeigen.
herbivore du meinst bestimmt den Node.Tag?! Aber dazu brauch ich doch auch ne Switch oder wie meinst du das?
Hallo -acid-,
du meinst bestimmt den Node.Tag?!
mit TreeNode meinte ich die Klasse. Beim Aufruf muss naürlich das Objekt eingesetzt werden, also tmpNode.Tag oder Node.Tag.
Aber dazu brauch ich doch auch ne Switch oder wie meinst du das?
Nein, gerade nicht. Ich meine es so wie oben beschrieben. Also statt deinem Code:
((MyControl)tmpNode).AddValue(myClass);
((MyControl)Node).BringToFront();
wobei in TreeNode.Tag das jeweilige MyControl gespeichert sein muss. Schon ein bisschen kürzer, gell?
herbivore
Sorry also das verstehe ich nicht ganz.
Muss es dann so lauten?
if (tmpNode != null)
(this.treeView.SelectedNode)tmpNode).AddValue(myClass);
((Node)Node).BringToFront();
tmpNode = Node;
Hallo -acid-,
nein, muss so lauten, wie ich geschrieben habe. 🙂 Mein Code ist ein direkter Ersatz für deinen Code mit dem switch von "Heute, 10:33".
herbivore
*argh* MyControl ist ja die Typenangabe. Manchmal könnt ich mich selbst schlagen. Danke.
Werde das heute Abend mal testen. Hoffe es klappt so wie ihr euch das vorstellt Leute 👍
herbivore: MyControl gibt es bei mir nicht! Es gibt MyControl1, MyControl2... und da brauch ich dann doch ne switch oder?
roland: Enums können anscheinend nicht static sein! Habe es jetzt außerhalb der Klasse in eine extra Klasse "Parameters" gepackt.
Hallo -acid-,
nein, du brauchst einfach eine gemeinsame Oberklasse MyControl.
herbivore
Hab jetzt das hier aber es geht nicht
(Cannot convert to static type 'MyControls')
(Cannot convert type 'System.Windows.Forms.TreeNode' to 'MyControls')
Liegt es daran, dass MyControls-Klasse nicht static sein darf?
public static class MyControls
{
public static MyControl1 myControl1 = new MyControl1();
public static MyControl2 myControl2 = new MyControl2();
}
public partial class frmMain : Form
{
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode Node = this.treeView1.SelectedNode;
if (tmpNode != null)
((MyControls)tmpNode).AddValue(siffer);
((MyControls)Node).BringToFront();
tmpNode = Node;
}
}
Hallo -acid-,
Liegt es daran, dass MyControls-Klasse nicht static sein darf?
ja, der erste Fehler kommt daher. MyControl muss Oberklasse von MyControl1 werden und nicht nur schlicht ein MyControl1 enthalten:
class MyControl : UserControl
class MyControl1 : MyControl
class MyControl2 : MyControl
Außerdem muss - das hatte ich stillschweigend vorausgesetzt - MyControl eine virtuelle Methode AddValue enthalten. OOP eben!
Der zweite Fehler kommt von mir. Mein Code oben stimmte doch nicht 100%ig. Es muss heißen:
((MyControl)tmpNode.Tag).AddValue(myClass);
((MyControl)Node.Tag).BringToFront();
Auch wenn es dir schwierig scheint: Du eignest dir gerade die Grundlagen der OOP an. Und das zahlt sich mehr aus, als bei einem - nur scheinbar - einfacheren switch stehen zu bleiben.
herbivore
Ähm ich sag mal zögerlich ok. Diese virtuelle Methode habe ich jetzt so:
public virtual void AddValue() { }
Muss da jetzt als Parameter (MyClass myClass) rein?! Und was muss in die Methode? btw verstehe ich nicht das Virtual.
Gesamt sieht das so aus:
public class MyControl : UserControl
{
public virtual void AddValue(MyClass myClass) { }
}
public class MyControl1 : MyControl {}
public class MyControl2 : MyControl {}
Hallo -acid-,
sieht gut aus. Klar muss die Methode den Parameter MyClass myClass haben, aber in ihren Rumpf muss nichts rein, sie ist einfach ein Platzhalter. Du könntest MyClass wohl auch abstrakt machen. Virtual sorgt dafür, dass später die richtige Methode aufgerufen wird. Ohne virtual würde später immer die Methode von MyClass aufgerufen werden, mit virtual wird später die Methoden von MyClass1 bzw. MyClass2 ... aufgerufen.
herbivore
Wenn ich jetzt starte bringt er mir:
//
// imageList1
//
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
this.imageList1.Images.SetKeyName(0, "tmp.png");
Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "frmMain.resources" was correctly embedded or linked into assembly at compile time, or that all the satellite assemblies required are loadable and fully signed.
Also ich hab nochmal geschaut. Irgendwas macht das neue Einbinden der Klassen kaputt. Keine Ahnung ?(
Nach genauem Analysieren ist mir aufgefallen, dass ich KEINE zweite Klasse in der frmMain-Klasse einbinden darf. Allein
public class test {}
erzeugt schon die Exception mit der unten stehenden Fehlermeldung.
Das "Schweigen" zeigt mir, dass ihr selber nicht weiter wisst. Nun habe ich heute Nacht kaum geschlafen weil mich das juckt. Jetzt habe ich mir gedacht evtl. diese Klasse in eine andre Datei auszulagern. Siehe da es geht.
In der MyControl.cs steht also jetzt:
public class MyControl : UserControl
{
public virtual void AddValue(MyClass myClass) { }
}
public class MyControl1 : MyControl {}
public class MyControl2 : MyControl {}
Wenn ich nun das Event AfterSelect von dem TreeView auslöse, kommt diese Fehlermeldung: "Object reference not set to an instance of an object." Und er makiert diese Zeile:
((MyControl)Node.Tag).BringToFront();
Als Troubleshooting schlägt er vor "new" zu benutzen. Habe auch schon mein Buch zur Hilfe geholt und etwas davon gelesen in Verbindung mit virtual. Leider komme ich nicht weiter.
Was vielleicht auch noch interessant ist, dass
MessageBox.Show(Node.Tag.ToString());
nciht ausgegeben werden kann erst wenn ich
Node.Tag = "test";
mache. Evtl. ist das eine weitere Fehlerquelle.
Hallo -acid-,
wie ich schon oben geschrieben habe, musst du in TreeNode.Tag die myControl1-, myControl2, ...-Objekte speichern. TreeNode.Tag ist defaultmäßig null und dann kommt natürlich die Exception.
herbivore
herbivore danke nochmal. Ich kann durchaus verstehen, dass du mir nicht alles vorkauen willst, aber meinst du nicht es wäre sinnvoller, dies etwas abzukürzen? Nochmals ich habe nicht verstanden wie du dir das vorstellst - manchmal sagt Code eben mehr als 1000 Worte.
Warum die Exception kommt ist mir jetzt klar. Leider nicht, wo ich TreeNode.Tag zuweisen soll. Außerdem kann ich doch TreeNode.Tag nur eine Zuweisung geben oder? Ich kann mir halt leider nicht vorstellen wie das aussehen soll.
Hallo -acid-,
ich bin sicher nicht der, der den Thread in die Länge ziehen will. Auf der anderen Seite, geht es ja nur darum funktionierenden Code durch besseren Code ersetzen. Das heißt, du musst die Zuweisungen so und dort machen, dass das gleiche Ergebnis entsteht, wie zuvor.
Dazu ein Beispiel: Wenn tmpNode.Name "node1" ist soll myControl1.AddValue(myClass); ausgeführt werden. Ersetzt wurde das durch ((MyControl)tmpNode.Tag)AddValue(myClass);. Also muss in dem TreeNode, dessen Name "node1" ist, im Tag myControl1 stehen. Wann du diese Zuweisung ausführst ist egal, solange sie vor dem ersten Aufruf von treeView1_AfterSelect erfolgt.
Alles klar?
herbivore
Ahhhhh nein wie geil, ok bin schon etwas weiter mit dem Verstehen. Alles klar. Habe die Zuweisung im Designer gemacht (wenn ich dich richtig verstanden habe ist es dort auch ok).
Wenn ich jetzt den TreeNode anklicke, kommt die Meldung:
"Unable to cast object of type 'System.String' to type 'MyControl'." - was mir nicht klar ist.
if (Node.Tag != null)
{
((MyControl)Node.Tag).BringToFront();
}
Nochmal meine MyControl.cs:
public class MyControl : UserControl
{
public virtual void AddValue(MyClass myClass) { }
}
public class MyControl1 : MyControl { }
public class MyControl2 : MyControl { }
Hallo -acid-,
ich würde tippen, dass "myControl1" (also als String) und nicht myControl1 (also das Objekt) zugewiesen wurde.
herbivore
Ok, aber wenn ich es im Designer nicht machen darf, weil es dort als String gespeichert wird, wo und wie dann?
Hallo -acid-,
im Konstruktor des Forms, das treeview1 enthält, nach InitializeComponents.
herbivore
Aber da habe ich doch keinen Zugriff auf den jeweiligen Node? Bzw nur über Index oder den Namen?!
Achaj und wenn ich da schreibe:
...node1.tag = myControl1;
...node2.tag = myControl2;
kommt es doch auch auf eine switch heraus oder.
Hallo -acid-,
ich kenne den Designer nicht und kann dir daher dazu nichts raten. Aber wenn du über den Index zugreifen kannst, ist das voll ok.
kommt es doch auch auf eine switch heraus oder.
Sehe ich nicht so. Das sind einfach Zuweisungen.
Natürlich erfolgt bei ((MyControl)tmpNode.Tag)AddValue(myClass); intern auch so eine Art "switch", aber man muss den switch eben nicht ausprogrammieren und das ist gerade der Vorteil.
herbivore
Dann fang ich wieder an zu gucken in welcher Ebene des TreeViews ich bin und setzte die Indexes... halte ich für sehr umständlich. Dann lieber über den Namen wobei das auch wieder umständlich bei der Änderung ist... Hm.
Hallo -acid-,
wenn das so ist, ist das aber eine Schwäche des Designers.
Ich persönlich würde die TreeNodes ohnehin direkt im Code erzeugen. Dann ist das Setzen von TreeNode.Tag ein leichtes.
TreeNode.Tag ist extra für den Fall, den wir hier behandeln, geschaffen. Wenn das über den den Designer nicht auf beliebige Objekte setzbar ist, ist das - wie gesagt - eine Schwäche des Designers.
herbivore
Schon klar. Habs grad mal versucht mit
this.treeView1.Nodes["nodTemp"].Tag = MyControl1;
nach InitializeComponent(); zu setzen. Dort bringt er mir dann folgende Meldung:
"MyControl1' is a 'type' but is used like a 'variable'"
Hallo -acid-,
myControl1 statt MyControl1
Oh, oh, jetzt bin ich aber doch schon wieder voll am vorkauen. 🙂
herbivore
Jetzt habe ich
public MyControl1 myControl1 = new MyControl1();
danach
this.treeView1.Nodes["nodTemp"].Tag = myControl1;
und dann bringt er:
"Missing partial modifier on declaration of type 'MyControl1'; another partial declaration"
Hier die Klasse MyControl1.cs
public partial class MyControl1 : UserControl
{
public MyControl1()
{
InitializeComponent();
}
public void AddData(MyClass myClass)
{
...
}
}
Partial: Partial type definitions allow the definition of a class, struct or interface to be split into multiple files.
Hallo -acid-,
ich denke du kannst und musst partial weglassen.
herbivore
hab ich gerade probiert -> namespace already contains a definition for 'MyControl1'
//
Bitte bedenke, dass wir auch noch die MyControl.cs haben:
public class MyControl : UserControl
{
public virtual void AddValue(MyClass myClass) { }
}
public class MyControl1 : MyControl { }
public class MyControl2 : MyControl { }
Hallo -acid-,
sehe erstmal keinen Grund das zu trennen, aber wenn du es getrennt hast, dann muss natürlich an beiden Stellen partial stehen.
Die letzten paar Fragen haben nichts mehr mit dem eigentlichen Problem zu tun, sondern es geht nur noch um Syntaxfehler. Wie du bestimmt weißt, lasse ich kaum eine Gelegenheit aus, darauf hinzuweisen, dass man lernen muss Syntaxfehler selbst du beheben.
herbivore
herbivore habe auch schon das partial auf die andre Klasse gesetzt. Er hat einfach damit ein Rroblem, dass im gleichen Namespace zweimal die gleiche Klasse existiert... Daher rührt der Fehler.
Hallo -acid-,
wenn man class A und nochmal_ class A_ schreibt hat man zwei Klassen, die beide A heißen und das ist ein Fehler. Wenn man partial class A und nochmal partial class A schreibt hat man nur eine Klasse A, bestehend aus zwei Teildefinitionen. Dafür ist partial ja gerade da. Die beiden Teil dürfen nicht nur im gleichen Namespace sein, sondern müssen das sogar!
Aber ich verstehe nach wie vor nicht, warum du die Definition von MyControl überhaupt in zwei Teile teilen willst. Ich halte das nicht für nötig.
Und nochmal den Hinweis, sich durch Syntaxfehler - mit Hilfe der SDK-Doku - am besten selbst durchzubeissen.
herbivore
Häh?! Also jetzt verstehe ich garnix mehr. Partial hin oder her (den Sinn habe ich schon verstanden) aber was wohin gehört weiß ich jetzt nicht mehr.
Der Fehler mit dem doppelten Vorkommen ist ja nur entstanden, weil du meintest ich sollte das hier
public class MyControl : UserControl
{
public virtual void AddValue(MyClass myClass) { }
}
public class MyControl1 : MyControl { }
public class MyControl2 : MyControl { }
in die frmMain mit einbinden, was aber nicht ging und ich deshalb das in eine extra Datei namens MyControl.cs eingebunden habe.
Außerdem habe ich nach wie vor die Datei MyControl1.cs welche mein eigentliches Control darstellt, welches später dann im MainPanel angezeigt werden soll.
Hallo -acid-,
vielleicht muss ich etwas deutlicher werden. Ich bin ein hilfsbereiter Mensch. Doch auch meine Hilfsbereitschaft hat Grenzen. In diesem Thread steht m.E. alles, was man braucht, um den switch zu vermeiden. Es handelt sich zudem um die Anwendung einer grundlegenden objektorientierten Technik. Alles weitere sind Syntaxfehler bei der Umsetzung. Trotz meiner offen geäußerten Meinung zum Selberlösen von Syntaxfehlern hast du immer weiter gefragt und ich habe mehrfach Hinweise gegeben. Jetzt ist meine Hilfbereitschaft erschöpft. Der Thread ist für mich beendet. Trozdem oder gerade deswegen viel Erfolg. Das Problem ist lösbar.
herbivore