Entwickler-Ecke
WinForms - Combo"such"box ähnlich wie in Studi
Sibastschen - Mo 01.03.10 10:59
Titel: Combo"such"box ähnlich wie in Studi
Hallo C-Sharp Freunde,
ich probiere mich seit knapp nen Monat an C# im VS von MS.
2 Lehrbücher und 2 Onlinebooks sind meine Lehrer, und das Forum mein bester Freund ;) aber nirgends fand ich eine antwort.
Die Beispiel tuts übertrage ich und modifiziere sie in mein Gesamtprojekt ein, ein komplettes Telefonbuch zu erstellen.
Stand der Dinge ist, Einträge lassen sich hinzufügen bearbeiten, der Speicher ist dynamisch, restl. Tage zum Geburtstag werden angezeigt, Einträge werden in die Combox übertragen ... usw....
nun hätte ich ganz gerne eine Suchfunktion in einer Combobox (da später auch fotos zum Adresseintrag gespeichert werden sollen). Diese Suchfunktnion sollte ähnlich wie bei z.B.StudiVZ sein.
Wenn man in der Combobox einen Buchstaben eingibt öffnet sich das DropDown Menü, und unterstreicht(makiert o.ä.) die Einträge welche diesen String bzw. die String folge beinhalten. je differenzierter die Eingabe desto kleiner wird die angezeigte Liste im Dropdown fällt...
Das habe ich versucht über das Keypress event der Combobox abzufangen... aber ich bekomme das Dropdown nicht geöffnet bei der eingabe, die liste wird nicht aktualisiert, bzw. nicht übereinstimmende einträge nicht ausgeblendet...
und nun wende ich mich an euch und hoffe das ihr mir helfen könne...
Vielen Dank schonmal im Vorraus
Sibastschen
P.S. hier sind die Code schnippsel, sollten mehr benötigt werden einfach nur bescheid sagen ;)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void Suchcombofill() { suchcobox.Items.Clear(); suchcobox.BeginUpdate(); for (int i = 0; i < max; i++) { suchcobox.Items.Add(pListe[i].spitzName +" , "+ pListe[i].vorName +" , "+ pListe[i].nachName); } suchcobox.EndUpdate(); }
private void suchcobox_KeyPress(object sender, KeyPressEventArgs e) { int index = suchcobox.FindString(suchcobox.Text); suchcobox.SelectedIndex = index; } |
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
norman2306 - Mo 01.03.10 11:13
Also am besten wird es sein, du nutzt die AutoComplete-Funktion der ComboBox.
C#-Quelltext
1: 2: 3: 4:
| AutoCompleteStringCollection accSource = new AutoCompleteStringCollection(); accSource.Add("Earl"); comboBox1.AutoCompleteCustomSource = accSource; comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; |
Erst erstellst du eine globale AutoCompleteStringCollection. Die weist du im Constructor zu. Für jeden Eintrag den du hast, machst du ein Add.
Sibastschen - Mo 01.03.10 11:18
Wenn ich dich richtig Verstanden habe für jeden EINTRAG ein ADD, dann müsste ich bei jeder Veränderung des Telefonbuches ja das Programm neu schreiben???
Also Die Personen informationen werden so hinterlegt, und so wird auch der maximale zugewiesene Speicher festgelegt.
Ich hoffe das hilft weiter...
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: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87:
| private void neuBut_Click(object sender, EventArgs e) { Person[] temp = new Person[max]; for (int i = 0; i < max; i++) { temp[i].spitzName = pListe[i].spitzName; temp[i].vorName = pListe[i].vorName; temp[i].nachName = pListe[i].nachName; temp[i].geburt = pListe[i].geburt; temp[i].telNum = pListe[i].telNum; temp[i].hanNum = pListe[i].hanNum; temp[i].eMail = pListe[i].eMail; temp[i].partner = pListe[i].partner; temp[i].partnerName = pListe[i].partnerName; temp[i].gebCheck = pListe[i].gebCheck; }
pListe = new Person[max+1]; for (int i = 0; i < max; i++) { pListe[i].spitzName = temp[i].spitzName; pListe[i].vorName = temp[i].vorName; pListe[i].nachName = temp[i].nachName; pListe[i].geburt = temp[i].geburt; pListe[i].telNum = temp[i].telNum; pListe[i].hanNum = temp[i].hanNum; pListe[i].eMail = temp[i].eMail; pListe[i].partner = temp[i].partner; pListe[i].partnerName = temp[i].partnerName; pListe[i].gebCheck = temp[i].gebCheck;
} max = max + 1; speichern(); pos++; anzeigen(); backbutton.Enabled = true; forbutton.Enabled = false; } private void neuBut_Click(object sender, EventArgs e) { Person[] temp = new Person[max]; for (int i = 0; i < max; i++) { temp[i].spitzName = pListe[i].spitzName; temp[i].vorName = pListe[i].vorName; temp[i].nachName = pListe[i].nachName; temp[i].geburt = pListe[i].geburt; temp[i].telNum = pListe[i].telNum; temp[i].hanNum = pListe[i].hanNum; temp[i].eMail = pListe[i].eMail; temp[i].partner = pListe[i].partner; temp[i].partnerName = pListe[i].partnerName; temp[i].gebCheck = pListe[i].gebCheck; }
pListe = new Person[max+1]; for (int i = 0; i < max; i++) { pListe[i].spitzName = temp[i].spitzName; pListe[i].vorName = temp[i].vorName; pListe[i].nachName = temp[i].nachName; pListe[i].geburt = temp[i].geburt; pListe[i].telNum = temp[i].telNum; pListe[i].hanNum = temp[i].hanNum; pListe[i].eMail = temp[i].eMail; pListe[i].partner = temp[i].partner; pListe[i].partnerName = temp[i].partnerName; pListe[i].gebCheck = temp[i].gebCheck;
} max = max + 1; speichern(); pos++; anzeigen(); backbutton.Enabled = true; forbutton.Enabled = false; } |
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
danielf - Mo 01.03.10 11:27
Hallo und :welcome:,
das Add kannst du auch dynamisch in deinem Code aufrufen - so meinte er das.
Dein Code macht ziemlich wirre Sachen :o Vlt. solltest du mit Kommentaren anzeigen was du machen willst und dann den Code stückweise daran umsetzen. Dann kannst du es a) später besser nachvollziehen und b)sicher gehen, das es noch logisch ist :).
Die AutoCompleteMode setzen halte ich auch für die einfachste Variante und auch die Gängigste. Alternativ könntest du ein ListView nehmen in der du eingaben abhängig spezielle Formatierung/Selektion vornimmst. Ich denke das wäre aber an dieser Stelle für dich zu viel Aufwand, so dass ich wirklich zu der AutoCompleteMode rate.
Gruß Daniel
norman2306 - Mo 01.03.10 11:50
Das sieht allgemein etwas umständlich aus, wie du das machst. Ich gebe dir mal ein paar Vorschläge:
Also, erstmal die Funktion bei dir hinzufügen. Damit kannst du Array etwas hinzzufügen:
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:
| public static T[] Add<T>(this IEnumerable<T> array, T Value, int Index) { T[] arr1 = array.Take(Index).ToArray(); Array.Resize(ref arr1, arr1.Length + 1); arr1[arr1.Length - 1] = Value; T[] arr2 = array.Skip(Index).ToArray(); array = arr1.Concat(arr2);
return array.ToArray(); }
public static T[] Add<T>(this IEnumerable<T> array, T Value) { T[] arr1; if (array == null) arr1 = new T[0]; else arr1 = array.ToArray(); Array.Resize(ref arr1, arr1.Length + 1); arr1[arr1.Length - 1] = Value; return arr1; } |
Du kannst auch eine Person-Collection-Klasse definieren, dann musst du nicht mit Arrays arbeiten. Und die besitzen automatisch ein Add-Befehl. Dann kannst du dir den Schmuss da oben sparen.
C#-Quelltext
1: 2:
| public class PersonCollection : System.Collections.Generic.List<Person> {} |
Wenn du jetzt deine pListe als PersonCollection deklarierst, kannst du adden und dein Code für das hinzufügen verkürzt sich etwas:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private void neuBut_Click(object sender, EventArgs e) { pList = pList.Add(new Person()); pList.Add(new Person());
speichern(); pos++; anzeigen(); backbutton.Enabled = true; forbutton.Enabled = false; } |
So, und jetzt zur eigentlichen Frage:
Meinetwegen, du hast eine Combobox für Spitznamen. Irgendwann musst du das alles ja mal irgendwoher laden. Dann machst du für das Laden für jede Person:
C#-Quelltext
1:
| accSource.Add(myPerson.spitzName); |
accScource deklarierst du ja global. Das bleibt dir also erhalten. Und wenn du eine neue Person hinzufügst, machst du wieder:
C#-Quelltext
1:
| accSource.Add(newPerson.spitzName); |
ich hoffe mal, das hilft dir ein wenig
Sibastschen - Di 09.03.10 10:22
Danke für die viele Unterstützung... wie gesagt. bin ich relativ neu... und hatte jetzt ein anderes Projekt was ich vorschrieben musste... und werde die Woche erst dazu kommen das hier umzusetzen und einzubauen;)
Aber ich BEDANKE mich schonmal im Vorraus... und werde dann nochmal ein statement abgeben ob es so geklappt hat ;)
Ansonsten muss ich nochmal Fragen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!