Laden...

abgel. Combobox, DataSource im Konstruktor, Fehler dank Designer

Erstellt von kraeppy vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.844 Views
K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 9 Jahren
abgel. Combobox, DataSource im Konstruktor, Fehler dank Designer

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 😃

2.298 Beiträge seit 2010
vor 9 Jahren

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 |

K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 9 Jahren

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

771 Beiträge seit 2009
vor 9 Jahren

Du könntest mal versuchen die DataSource erst im Control.HandleCreated Event zu setzen.

S
145 Beiträge seit 2013
vor 9 Jahren

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)

2.298 Beiträge seit 2010
vor 9 Jahren

@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 |

K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 9 Jahren

@inflames2k: s.o. ...

die anderen ratschläge teste ich morgen.

danke und schönes restl we

2.298 Beiträge seit 2010
vor 9 Jahren

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 |

S
93 Beiträge seit 2008
vor 9 Jahren

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.

Gelöschter Account
vor 9 Jahren

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.)