hey ho 😃
ich habe folgendes Problem:
ich leite mich von einer Combobox ab, im konstruktor setze ich lediglich den dropdownstyle auf dropdownlist und setze die datasource mit dem befehl:
this.DataSource = Enum.GetValues( typeof( Archiver.Archive ) );
wenn ich dieses control auf irgendeine form, usercontrol, was auch immer ziehe, erstellt mir der designer folgenden code:
// archiveCombobox1
//
this.archiveCombobox1.DataSource = new FC.Archiver.Archive[] {
FC.Archiver.Archive.InNewSubFolder,
FC.Archiver.Archive.InSameFolder,
FC.Archiver.Archive.InGlobalSelectedFolder,
FC.Archiver.Archive.InFileDialogFolder};
this.archiveCombobox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.archiveCombobox1.FormattingEnabled = true;
this.archiveCombobox1.Items.AddRange(new object[] {
FC.Archiver.Archive.InNewSubFolder,
FC.Archiver.Archive.InSameFolder,
FC.Archiver.Archive.InGlobalSelectedFolder,
FC.Archiver.Archive.InFileDialogFolder});
this.archiveCombobox1.Location = new System.Drawing.Point(201, 51);
this.archiveCombobox1.Name = "archiveCombobox1";
this.archiveCombobox1.Size = new System.Drawing.Size(121, 21);
this.archiveCombobox1.TabIndex = 0;
Problem ist folgendes:
die datasource wird gesetzt, danach sollen die items hinzugefügt werden. dann kommt die schlaue Meldung > Fehlermeldung:
wenn' ne datasource gesetzt ist, können keine Elemente hinzugefügt werden (eben an der stelle ...Items.AddRange(...)).
ich lösche den aufruf items.addRange(...), dann kann's kompiliert werden, aber iwann fügt mir der scheiß designer wieder diesen items.addRange(...) mist hinzu.
muss ich die datasource-Eigenschaft woanders setzen? oder ist das einfach n bug, mit dem ich leben muss?
gruß und schönes we
kraeppy 😃
Hallo,
an welcher Stelle im Code (Methode) steht denn die Zeile?
this.DataSource = Enum.GetValues( typeof( Archiver.Archive ) );
Da ich vermute, dass es im Constructor oder ähnlichem passiert, verhindere die Zuweisung im DesignMode.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
hi,
sorry aber lies dir meinen post nochmal genau durch...
die antwort auf deine frage findest du in meinem ersten post im ersten satz...
wie du unten lesen kannst, habe ich dens befehl items.addrange =... geloescht und es steht dort auch, dass der items.addrange code (autom.) neu erzeugt wird.
danke fuer den versuch zu helfen aber das war wohl nix...
gruss
Schnittstelle ISupportInitialize setzen und im EndInit die DataSource zuweisen.
Oder auch DesignerSerializationAttribute mit Hidden angeben bei der Eigenschaft, wenn die DataSource eh nicht geändert werden darf.
(ist die Eigenschaft nicht überschreibbar würd ich mit new diese angeben)
@kraeppy
Hi,
sorry aber so abwegig war meine Frage garnicht. Denn der Designer macht Sachen nicht einfach so. Deshalb meine Vermutung, dass du die DataSource im Constructor oder der Load-Methode bindest.
Außerdem hat dein Wiederspruch mit meiner Antwort absolut nichts zu tun. Schließlich fragte ich nicht nach dem "Items.AddRange" sondern wo du die **DataSource **zuweist. Da nun aber auch in deinem Eingangspost steht, dass die Zuweisung im Constructor passiert, gilt mein Tipp immernoch, dass die Zuweisung nur durchgeführt wird, wenn die Anwendung nicht im DesignMode ist.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
@inflames2k: s.o. ...
die anderen ratschläge teste ich morgen.
danke und schönes restl we
Ich lass es bleiben, mein Hinweis mit dem Designmode dürfte passen. Aber wenn du dich lieber daran aufhängst das ich einen Teil überlesen / nicht beachtet hatte, was ich bereits korrigiert habe, dann kann ich dir nicht helfen.
Dennoch bekommst du ein paar Links von mir.
System.ComponentModel.Component.DesignMode
C# Detecting design mode from a Control's constructor
Ich finds nun nur ehrlich gesagt frech, dass du die passenden Hinweise ignoriert hast und stattdessen fast schon überheblich reagierst.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Mal etwas logisch denken!
inflames2k hat doch schon gesagt, woran es liegt.
Die Fehlermeldung sagt doch auch alles.
Du setzt die DataSource im Konstructor des Controls.
Wenn Du dann das Control auf ein Form ziehst, wird eben zuerst die Datasource zugewiesen.
Dann kommt logischweise der Fehler, wenn danach Items.AddRange ausgeführt wird.
Du mußt einfach die DataSource woanders setzen.
Nein, er muss sich einfach entscheiden ob er das Control mittels Binding(also DataSource) nutzen will oder ob er/sie selbst rumfrickelt Beides zusammen geht nicht. Das gilt für alle WF Controls die eine DataSource anbieten. Das ist der ganze Sinn hinter dem DataBinding, nicht mehr an der Oberfläche rumzupulen. Ob er das Control hier ableitet, Designer Code hin oder her spielt eigentlich keine Rolle. Wenn ich eine DataSource != null zuweise versetze ich das Control in den Binding Mode und irgendwelche händischen Rows, Columns, Items Anweisungen auf der Oberfläche werden dann nicht mehr akzeptiert, und das ist auch gut so meine Damen und Herren, wie wir in Berlin dank unserem Bürgermeister zu sagen pflegen.
Nach meinem dafür halten der Fragesteller diesen Unterschied noch nicht ausreichend verstanden.
(BTW: Manche Controls wie das DataGridView machen in bestimmten Situationen Ausnahmen von der Regel das man sie im im "Binding Mode" nicht oberflächlich bearbeiten darf.)