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
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:
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.
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.
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...
> 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.htmhttp://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