| Autor |
Beitrag |
hui1991
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Fr 04.09.09 08:40
Hallo,
ich wollte eine Eigenschaft Disabled und das Ausgeschaltet in der Eigenschaft steht beim Eigenschaften-Fenster vom Visual Studio 2008.
Im Screenshot so soll es aussehen.jpg sieht das schonmal gut aus:
| Zitat: |  |
Ich hab ein Beispiel-UserControl geschrieben bei der das selbe Problem ist.
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms;
namespace Eigenschaften { public partial class TestControl : UserControl { bool aktiv = true; TestEnum eigenschaft;
public TestControl() { InitializeComponent(); }
public TestEnum TestProperty { get { if (!aktiv) throw new Exception("Ausgeschaltet"); return eigenschaft; } set { if (!aktiv) throw new Exception("Ausgeschaltet"); eigenschaft = value; } }
public bool Aktiv { get { return aktiv; } set { aktiv = value; } } }
public enum TestEnum { Eins, Zwei, Drei, Vier } } |
Wenn ich das UserControl auf die Form ziehe und dort die Eigenschaft Aktiv auf False stelle und speichern will, dann kommt von Visual Studio 2008 folgende Fehlermeldung:
| Zitat: | ---------------------------
Microsoft Visual Studio
---------------------------
Fehler bei der Codegenerierung für die TestProperty-Eigenschaft. Fehler: Der Eigenschaftenaccessor TestProperty für das testcontrol1-Objekt hat folgende Ausnahme verursacht: Ausgeschaltet
---------------------------
OK
--------------------------- |
Wie bekomme ich das hin ohne das Visual Studio 2008 meckert? Ich will das Enum nicht einfach Erweitern, weil es bei Listen oder Arrays genauso aussehen soll.
Einloggen, um Attachments anzusehen!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 04.09.09 09:34
Wenn ich Dich richtig verstehe, soll die Exception im Designmode auch dann nicht kommen, wenn aktiv = false ist? Falls ja: Mittles this.DesignMode kannst Du abfragen, ob Du im DesignMode bist 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Fr 04.09.09 10:04
this.DesignMode bringt mich nicht weiter.
Also ich versuch das nochmal zu erklären was ich will:
Wenn aktiv auf True ist, kann man von dem enum die 4 Werte auswählen, dass ist schonmal richtig.
Wenn aktiv auf False ist, soll man nichts auswählen können und Ausgeschaltet sehen.
Wollte das im Designer so anzeigen.
Das Problem ist das er versucht die Exception zu speichern (denk ich zumindest).
Schalte ich das aus, dass er die Daten nicht speichert ( [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]) kommt keine Fehlermeldung, aber die Einstellungen werden auch nicht gespeichert.
Und eine if abfrage bekomme ich nicht rum
Also so z. B.:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| if(!aktiv) [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TestEnum TestProperty { get { if (!aktiv) throw new Exception("Ausgeschaltet"); return eigenschaft; } set { if (!aktiv) throw new Exception("Ausgeschaltet"); eigenschaft = value; } } |
Das funktioniert aber leider nicht
Wenn das nicht funktioniert, dann kann die Eigenschaft auch einfach nur ausgeblendet sein so lange aktiv auf false ist.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 04.09.09 10:40
Du wirfst eine Exception, wenn der Designer versucht, den Wert zu lesen. Ist doch logisch, dass das nicht klappt. Daher die Sache mit dem DesignMode: Wirf die Exception nur, wenn Du nicht im DesignMode bist.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Fr 04.09.09 10:50
Wenn ich das so mache, dann steht nie Ausgeschaltet in der Eigenschaft im Eigenschaftenfenster:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public TestEnum TestProperty { get { if (!aktiv) if(!this.DesignMode) throw new Exception("Ausgeschaltet"); return eigenschaft; } set { if (!aktiv) if(!this.DesignMode) return; eigenschaft = value; } } |
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 04.09.09 11:11
Wo soll der Text denn auch herkommen?
Irgendwie kapiere ich immer noch nicht ganz, wie Du Deine Eigenschaften konstruieren willst. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Fr 04.09.09 11:31
Wenn Aktiv auf True ist, dann kann man bei der TestProperty Eins, Zwei, Drei, Vier auswählen.
Wenn Aktiv auf False ist, dann kann man bei der TestProperty nichts auswählen und man sieht Ausgeschaltet. Soll dann genauso aussehen wie oben in dem Bild. Das Problem ist nur, bei klick auf Speichern kommt die Fehlermeldung.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 04.09.09 18:12
Genau so wirst du das dem Designer wohl nicht beibringen können. Gibt es denn einen triftigen Grund, warum du die zwei Eigenschaften nicht in einem Enum zusammenfasst  ?
_________________ >λ=
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Fr 04.09.09 21:18
Es geht nicht um die Enums sondern um die Eigenschaft.
Aber anscheinend gibt es keine Möglichkeit eine Eigenschaft vom Code aus zu deaktivieren. Naja dann lasse ich das erstmal bei den leeren Feldern.
Es gibt Felder die nur benötigt werden, wenn eine andere Eigenschaft auf einem bestimmten Wert liegt.
Ich hab es jetzt so geändert, anscheinend nur die einzige Möglichkeit
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms;
namespace Eigenschaften { public partial class TestControl : UserControl { bool aktiv = true; TestEnum eigenschaft;
public TestControl() { InitializeComponent(); }
public TestEnum TestProperty { get { if (!aktiv) return TestEnum.Ausgeschaltet; return eigenschaft; } set { if (!aktiv) return; eigenschaft = value; } }
public bool Aktiv { get { return aktiv; } set { aktiv = value; } } }
public enum TestEnum { Ausgeschaltet, Eins, Zwei, Drei, Vier } } |
Naja ich werd das erstmal so lassen bis ich was neues finde.
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 04.09.09 21:24
hui1991 hat folgendes geschrieben : | | Ich hab es jetzt so geändert |
So in etwa hatte ich das gemeint  . Und zumindest bei deinem Beispiel gibt es jetzt ja keinen Grund mehr, die "Aktiv"-Property noch länger zu behalten.
_________________ >λ=
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Fr 04.09.09 23:56
Naja bei Enums funktioniert das so, bei listen würde das vllt. so gehen, aber kann gerade nicht probieren:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| public List<string> StringList { get { if(!aktiv) return null; return stringlist; } set { if(aktiv) stringlist = value; } } |
Das Problem ist da wieder, dass man nicht weiß was sache ist und warum man das nicht ändern kann.
Vllt. würde ja auch das hier funktionieren:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public List<string> StringList { get { if(!aktiv) return null; return stringlist; } set { if(aktiv) stringlist = value; else throw new Exception("Kann nur geändert werden, wenn aktiv"); } } |
|
|