C# ComboBox ->Element inaktiv schalten

Gast #1667200
Lesenswert?

Hallo alle zusammen,

ich programmiere in Visual C#2008 Express und habe da eine Combobox mit
z.b 4 Elementen wie kann ich es bewerkstelligen das ich zur Programmlauf 
zeit z.b nur Index 0 und 2 der Combobox sichtbar und auswählbar mache.

Also zum Beispeil

Combobox Parität

Index
0  None
1  One
2  OnePointFive
3  Two

Sichtbar und aktiv anwählbar aber z.b nur

Index
0 None
3 Two
Gast #1667215
Lesenswert?

Ich will eine Combobox Parität machen um Parität für den SerialPort 
auswählbar zum machen

Und da soll drinstehen

Combobox Parität:
Keine, Ungerade , Gerade

Nur muss ich das ja irgendwie an Port.Parity übergeben und da müssen
die Indizies der Combobox mit den Indizies der Parity(vom Typ Enum)
Übereinander stimmen.

Ich denk da schon eine Weile drüber nach aber krieg den ###### nicht hin
Gast #1667277
Lesenswert?

Guten Morgen zusammen

"Quick and dirty"-Variante:

Füll die Combobox mit den Strings "Keine", "Ungerade" und "Gerade" und 
mach nen Switch-Case über comboBox.selectedItem.ToString()

In etwa so:
1
switch (comboBox1.SelectedItem.ToString())
2
{
3
    case "Keine":
4
        Port.Parity = System.IO.Ports.Parity.None;
5
        break;
6

7
    case "Ungerade":
8
        Port.Parity = System.IO.Ports.Parity.Odd;
9
        break;
10

11
    case "Gerade":
12
        Port.Parity = System.IO.Ports.Parity.Even;
13
        break;
14

15
    default:
16
        break;
17
}

Alternativ könntest du auch die comboBox mit den elementen der 
Enumeration System.IO.Ports.Parity füllen und dann das ausgewählte dem 
Port zuweisen. In etwa so:

Bei Form Load:
1
string[] elements = Enum.GetNames(typeof(System.IO.Ports.Parity));
2
comboBox1.Items.AddRange(elements);

Und dann, da wo du das ausgewählte zuweisen willst:
1
Port.Parity = (System.IO.Ports.Parity)Enum.Parse(typeof(System.IO.Ports.Parity), comboBox1.SelectedItem.ToString());

Nachteil an der zweiten Variante: Die Texte sind natürlich englisch und 
auf mobilen Geräten ist die Variante nicht zu empfehlen, da von dem 
Enum.GetNames und dem Enum.Parse die Metadaten vom .Net Framework 
durchsucht werden ;-)
#1667305
Lesenswert?

Sven schrieb:
> Guten Morgen zusammen
>
> "Quick and dirty"-Variante:

Mann kann es so machen. Aber es ist wirklich ziemlich Quick&Dirty.

Woran man sich gewöhnen muss, ist, dass man aus der Combobox (allgmeiner 
in keinem GUI-Element) ausser dem selektierten Item irgendetwas benutzt. 
Keine Reihenfolge, keinen Index. Sondern das Item selber muss
   den Text liefern können, den das GUI-Control dann anzeigt
   den internen Code liefern können, der dann intern beim Programm-
   ablauf weiter benutzt wird.

Das klingt am Anfang nach Aufwand, ist es aber nicht wirklich

Im Grunde geht es darum, eine Klasse zu machen, die die beiden 
Informationen

       GUI-String              (zb "Keine", "Ungerade", "Gerade")
und    System.IO.Parts.Parity

miteinander verknüpft. Eine Klasse also, die diese beiden Member hat. 
Dazu dieser Klasse noch eine ToString Funktion verpassen, damit die 
Combobox auch dieses 'Item' danach befragen kann, welchen Text sie 
anzeigen soll und das wars dann schon.

Ist wirklich nicht viel Aufwand. Aber ich gebe zu, beim ersten mal steht 
man da wie der Ochs vorm Tor.
Gast #1667338
Lesenswert?

Inwiefern kommt die nicht damit klar? Ich würde dann doch die Combobox 
mit den Keys aus dem Dictionary (also strings) füllen.

Und dann Port.Parity = dict[combobox.selectedItem]; // dict ist das 
Dictionary mit den Parity Typen
Gast #1667342
Lesenswert?

> Inwiefern kommt die nicht damit klar? Ich würde dann doch die Combobox
> mit den Keys aus dem Dictionary (also strings) füllen.

und damit vermischt du wieder inhalt und daten, weil du aus dem String 
wieder rückwärts zu den daten kommen musst. Sauber ist es wie oben 
geschrieben ein object zu haben was den String und die Daten getrennt 
enthält.
#1667358
Lesenswert?

Sven schrieb:
> Inwiefern kommt die nicht damit klar? Ich würde dann doch die Combobox
> mit den Keys aus dem Dictionary (also strings) füllen.

Probiers aus.
Du wirst sehen, dass das auch nicht weniger Aufwand ist :-)
Das liegt vor allen Dingen daran, dass du nicht einfach das Dictionary 
an die Combobox übergeben kannst :-)
Mann kann sich natürlich auch eine spezielle Combobox herleiten, die 
genau das kann.

Aber es gibt noch eine Lösung, die in deinem Fall geht.
Jedes Item hat ein Tag. Ein Tag kann jeds beliebige Object sein.
D.h. du addest den String in die Combobox und hängst den enum Wert an 
die Tag Eigenschaft dieses items.

Ich würds trotzdem über ein spezielles Objekt machen. Ist auf lange 
Sicht einfach übersichtlicher.
Gast #1667410
Lesenswert?

@Karl heinz Buchegger

deine Lösung mit den Objecten hört sich gut. An könntest
du mir da vielleicht ein paar Code Schnippsel zusammenstellen damit ich
mir über die Umsetzung dieser Lösung zielbringende Gedanken machen kann.

Im Klartext ich hab keine Ahnung wie das mit Objecten gemeint ist.
(Beschäftige mich aber auch nur seit 1.Tag mit C#)
Persönliche Seite #1667415
Lesenswert?

Zumindest die aus richtigen Programmiersprachen nutzbaren Combo- und 
Listboxen haben die Funktionen SetItemData und GetItemData, mit 
denen sich beliebige 32-Bit-Werte mit einem Combo- resp. Listbox-Item 
verknüpfen lassen.

Die Werte für die Parität ließen sich so darin unterbringen.

Ob das aus dem .Net-Geraffel heraus nutzbar ist, muss jemand anderes 
herausfinden, ich will es mir nicht ansehen.

[Edit: Ich gebe offen und freiherzig zu, gewisse Vorurteile gegenüber 
.Net zu haben.

Jedoch sollte eine Funktionalität, wie sie obige Win32-API-Funktionen 
zur Verfügung stellen, auch mit .Net nutzbar sein. Und also ist mein 
Beitrag zwar gehässig, aber nicht nutzlos]
#1667418
Lesenswert?

Peter schrieb:
> Karl heinz Buchegger schrieb:
>> Jedes Item hat ein Tag.
>
> sicher? In MFC (C, C++) ja aber in #c habe ich das noch nicht gefunden.
> Die Combobox selber hat ein Tag. Aber die Items sind nur vom Typ Object.
> und müssen eine Methode toString bereitstellen.

Ihr habt recht.
Irgendwie ist mir das durcheinander gekommen.
Ist schon lange her, seit ich das letzte mal mit C# was gemacht habe.
#1667426
Lesenswert?

Johann schrieb:
> @Karl heinz Buchegger
>
> deine Lösung mit den Objecten hört sich gut. An könntest
> du mir da vielleicht ein paar Code Schnippsel zusammenstellen damit ich
> mir über die Umsetzung dieser Lösung zielbringende Gedanken machen kann.
>
> Im Klartext ich hab keine Ahnung wie das mit Objecten gemeint ist.
> (Beschäftige mich aber auch nur seit 1.Tag mit C#)

Tu dir selbst einen Gefallen und kauf dir in der nächsten Buchhandlung 
ein C#-Buch. Es gibt da noch vieles, was man wissen sollte und ein Buch 
erklärt dir das alles. Es zeigt dir auch typische Vorgehensweisen und 
C#-Idiome, die immer wieder eingesetzt werden.

Eine Programmiersprache auf eigene Faust, nur durch Trial and Error 
lernen zu wollen, führt (vor allen Dingen wenn es die erste ist) 
unweigerlich ins Fiasko. Du wirst dir immer nur Halbwissen aneignen.
1
class ComboBoxItem {
2
  string                  _Contents;
3
  System.IO.Parts.Parity  _Parity;
4

5
  public string Contents {
6
    get { return _Contents; }
7
    set { _Contents = value; }
8
  }
9

10
  public System.IO.Parts.Parity Parity {
11
    get { return _Parity; }
12
    set { _Parity = value; }
13
  }
14

15
  public ComboBoxItem(string contents, System.IO.Parts.Parity parity)
16
  {
17
    this._Contents = contents;
18
    this._Parity = parity;
19
  }
20

21
  public override string ToString(){ return _Contents; }
22
}
23

24
.....
25

26
   // Befüllen
27
   Paritaet.Items.Add( new ComboBoxItem( "keine",    System.IO.Ports.Parity.None ) );
28
   Paritaet.Items.Add( new ComboBoxItem( "ungerade", System.IO.Ports.Parity.Odd ) );
29
   Paritaet.Items.Add( new ComboBoxItem( "gerade",   System.IO.Ports.Parity.Even ) );
30

31

32
  // Abfragen
33
  Port.Parity = ((ComboBoxItem)Paritaet.SelectedItem).Parity;


Ob der Datentyp für die Paritätskennungen wirklich 
System.IO.Parts.Parity heißt, hab ich jetzt nicht nachgeschlagen
#1667429
Lesenswert?

Rufus t. Firefly schrieb:
> Zumindest die aus richtigen Programmiersprachen nutzbaren Combo- und
> Listboxen haben die Funktionen SetItemData und GetItemData, mit
> denen sich beliebige 32-Bit-Werte mit einem Combo- resp. Listbox-Item
> verknüpfen lassen.
>
> Die Werte für die Parität ließen sich so darin unterbringen.
>
> Ob das aus dem .Net-Geraffel heraus nutzbar ist, muss jemand anderes
> herausfinden, ich will es mir nicht ansehen.
>
> [Edit: Ich gebe offen und freiherzig zu, gewisse Vorurteile gegenüber
> .Net zu haben.

Hab ich auch.
Aber in dem Fall muss ich ehrlich gestehen: Das ist OOP in Reinkultur, 
wie man das in C# macht.

Das SetItemData/GetItemData Geraffel (das sag ich hier bewusst) ist 
nicht wirklich schön.
Gast #1667431
Lesenswert?

> Zumindest die aus richtigen Programmiersprachen nutzbaren Combo- und
> Listboxen haben die Funktionen SetItemData und GetItemData, mit
> denen sich beliebige 32-Bit-Werte mit einem Combo- resp. Listbox-Item
> verknüpfen lassen.
Es geht ja genau darum, dass keine abstrakten Zahlen und deren Bedeutung 
getrennt verwaltet werden!

PS: .net ist nicht böse.
#1667432
Lesenswert?

Sven schrieb:
> Also, bei mir sind die ComboBox items nur vom typ object. Nen Tag hat
> nur die ComboBox an sich. Wo kann ich denn einen Tag an ein einzelndes
> Item anhängen?

Das object ist zuzusagen das Tag.
Beispielsweise könnte man das so implementieren...
1
    
2
    class ComboItem<T> {
3
        protected T mValue;
4
        public T Value {
5
            get { return mValue; }
6
            set { mValue = value; }
7
        }
8

9
        public override string ToString() {
10
            return mValue.ToString();
11
        }
12

13
        public ComboItem(T value) {
14
            mValue = value;
15
        }
16

17
    }
18

19
    // Einträge auffüllen
20
        foreach (Handshake item in Enum.GetValues(typeof(Handshake))) {
21
            comboBox1.Items.Add(new ComboItem<Handshake>(item));
22
        }
23
        comboBox1.Items.Add(new ComboItem<Parity>(Parity.Even));
24
        comboBox1.Items.Add(new ComboItem<Parity>(Parity.Odd));
Gast #1667438
Lesenswert?

> Es geht ja genau darum, dass keine abstrakten Zahlen und deren Bedeutung
> getrennt verwaltet werden!
Oder vielleicht etwas verständlicher formuliert :-) :
Es geht ja genau darum, dass abstrakte Zahlen und deren Bedeutung nicht 
getrennt verwaltet werden sollen.
Gast #1667450
Lesenswert?

Rufus t. Firefly schrieb:
> Jedoch sollte eine Funktionalität, wie sie obige Win32-API-Funktionen
> zur Verfügung stellen, auch mit .Net nutzbar sein. Und also ist mein
> Beitrag zwar gehässig, aber nicht nutzlos]

nein. Klar kann man die API funktionen nutzen macht aber überhaupt kein 
sinn, weil c# dafür bessere möglichkeiten bietet.
Der Vorteil ist ja das man in die Combobox jedes Objekt reinstecken kann 
was eine toString funktion hat.

Hier mal ein kleiner versuch es aus dem Kopf zu machen, wird bestimmt 
viele Fehler enthalten.

class ComboboxData {
   public String Text;
   public int Data;

   public ComboboxData( String Text, int Data );
   public String toString() {
      return Text;
   };

   public int GetData() {
       return Data;
   };
};

combobox.add( new ComboboxData('text', 1 ) );
ComboboxData data = (ComboboxData)ComboboxData.SelectetItem();

data.GetData();
#1667457
Lesenswert?

Peter schrieb:
> Rufus t. Firefly schrieb:
>> Jedoch sollte eine Funktionalität, wie sie obige Win32-API-Funktionen
>> zur Verfügung stellen, auch mit .Net nutzbar sein. Und also ist mein
>> Beitrag zwar gehässig, aber nicht nutzlos]
>
> nein. Klar kann man die API funktionen nutzen macht aber überhaupt kein
> sinn, weil c# dafür bessere möglichkeiten bietet.

So sehr es mich auch schmerzt, aber ich muss ihm recht geben.
Speziell an Rufus: Für uns alte C++/MFC Hasen ist das aber nichts. Wir 
mögen Sprachen mit Garbage Collection nicht :-)
Gast #1667460
Lesenswert?

@ Karl heinz Buchegger

An den Bücher scheiterts nicht da hab ich schon
Visual C# 2008
http://openbook.galileocomputing.de/csharp/intro.htm
http://openbook.galileocomputing.de/csharp/intro.htm

nur kann ich mit den auch nicht über mein Problem sprechen. Und Zeit zum
lesen von A bis Z hab ich auch nicht. Mein C# Tool muss in ein paar 
Wochen fertig sein.

Aufjeden Fall herzlichen Dank für die Lösung zum Problem ich setz das 
gleich mal um.
#1667476
Lesenswert?

Johann schrieb:
> @ Karl heinz Buchegger
>
> An den Bücher scheiterts nicht da hab ich schon
> Visual C# 2008
> http://openbook.galileocomputing.de/csharp/intro.htm
> http://openbook.galileocomputing.de/csharp/intro.htm
>
> nur kann ich mit den auch nicht über mein Problem sprechen. Und Zeit zum
> lesen von A bis Z hab ich auch nicht. Mein C# Tool muss in ein paar
> Wochen fertig sein.

Investiere ein paar Abende zum Lesen. Die Zeit kriegst du später locker 
wieder rein.
In einer Woche, abends 2 Stunden lesen, solltest du die wichtigsten 
Dinge zumindest gelesen haben. Das erste Kapitel ist traditionell so was 
wie eine Einführung - überfliegen.
Die Basiskapitel über Zahl und Variablen und dergleichen -> überfliegen.
Die ersten GUI Kapitel: lesen und zumindest die Programmbeispiele 
überfliegen.
Den Rest wieder überfliegen.

Du musst dich soweit bringen, dass du zumindest in etwa weißt, in 
welchen Kapitel du ein Lösungsangebot für ein Problem bekommst. Ein paar 
komplexere Programme studiert man dann etwas genauer.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren