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
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.
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
Das Beispiel ganz oben bezieht sich übrigen auf das Problem mit den Stoppbits
@Peter aber wie ein Object rein stecken,Text und ID ->klingt gut verstehe ich aber nicht mit C# in der Kennenlernphase
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 ;-)
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.
Wie wäre es den mit einem Dictionary<string, System.IO.Ports.Parity> Damit wäre doch alles schon fertig.
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.
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
> 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.
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.
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.
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?
@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#)
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]
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.
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
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.
> 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.
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)); |
> 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.
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();
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 :-)
@ 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.
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.
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.