Autor Beitrag
hui1991
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: 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:
so_soll_es_aussehen

Ich hab ein Beispiel-UserControl geschrieben bei der das selbe Problem ist.
ausblenden volle Höhe C#-Quelltext
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: 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.:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: Fr 04.09.09 10:50 
Wenn ich das so mache, dann steht nie Ausgeschaltet in der Eigenschaft im Eigenschaftenfenster:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 04.09.09 11:11 
Wo soll der Text denn auch herkommen? :gruebel:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 :nixweiss: ?

_________________
>λ=
hui1991 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: 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
ausblenden volle Höhe C#-Quelltext
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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 04.09.09 21:24 
user profile iconhui1991 hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab es jetzt so geändert
So in etwa hatte ich das gemeint :zwinker: . Und zumindest bei deinem Beispiel gibt es jetzt ja keinen Grund mehr, die "Aktiv"-Property noch länger zu behalten.

_________________
>λ=
hui1991 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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");
  }
}