mikrocontroller.net

Forum: PC-Programmierung C# ComboBox ->Element inaktiv schalten


Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum denn die anderen nich einfach löschen? Den index sollte man eh 
nicht verwenden wegen der sortierung. Steck lieber ein eigenen object 
rein und diese hat den Text und deine ID.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispiel ganz oben bezieht sich übrigen auf das Problem mit den
Stoppbits

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
aber wie ein Object rein stecken,Text und ID ->klingt gut
verstehe ich aber nicht mit C# in der Kennenlernphase

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
switch (comboBox1.SelectedItem.ToString())
{
    case "Keine":
        Port.Parity = System.IO.Ports.Parity.None;
        break;

    case "Ungerade":
        Port.Parity = System.IO.Ports.Parity.Odd;
        break;

    case "Gerade":
        Port.Parity = System.IO.Ports.Parity.Even;
        break;

    default:
        break;
}

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:
string[] elements = Enum.GetNames(typeof(System.IO.Ports.Parity));
comboBox1.Items.AddRange(elements);

Und dann, da wo du das ausgewählte zuweisen willst:
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 ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es den mit einem Dictionary<string, System.IO.Ports.Parity> 
Damit wäre doch alles schon fertig.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven schrieb:
> Wie wäre es den mit einem Dictionary<string, System.IO.Ports.Parity>
> Damit wäre doch alles schon fertig.

nein, weil soweit ich weiss kommt eine combobox nicht mit einem 
Dictionary klar.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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#)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
class ComboBoxItem {
  string                  _Contents;
  System.IO.Parts.Parity  _Parity;

  public string Contents {
    get { return _Contents; }
    set { _Contents = value; }
  }

  public System.IO.Parts.Parity Parity {
    get { return _Parity; }
    set { _Parity = value; }
  }

  public ComboBoxItem(string contents, System.IO.Parts.Parity parity)
  {
    this._Contents = contents;
    this._Parity = parity;
  }

  public override string ToString(){ return _Contents; }
}

.....

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


  // Abfragen
  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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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...
    
    class ComboItem<T> {
        protected T mValue;
        public T Value {
            get { return mValue; }
            set { mValue = value; }
        }

        public override string ToString() {
            return mValue.ToString();
        }

        public ComboItem(T value) {
            mValue = value;
        }

    }

    // Einträge auffüllen
        foreach (Handshake item in Enum.GetValues(typeof(Handshake))) {
            comboBox1.Items.Add(new ComboItem<Handshake>(item));
        }
        comboBox1.Items.Add(new ComboItem<Parity>(Parity.Even));
        comboBox1.Items.Add(new ComboItem<Parity>(Parity.Odd));

Autor: K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Lösung hier haben mir gut weitergeholfen man sollte hier ne
Spendenbox eröffnen da wo jeder der ne gut Antwort abgibt vom 
Problemsteller nen Euro kriegt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.