Autor Beitrag
Sibastschen
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 01.03.10 10:59 
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 ;)

ausblenden 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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mo 01.03.10 11:13 
Also am besten wird es sein, du nutzt die AutoComplete-Funktion der ComboBox.

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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...

ausblenden volle Höhe 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] = pListe[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] = pListe[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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: 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:

ausblenden volle Höhe 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:
/// <summary>
/// Fügt einem Array ein Element an der Position Index hinzu
/// MyArr = MyArr.Add(Value, Index)
/// </summary>
/// <typeparam name="T">Typparameter</typeparam>
/// <param name="array">Das Array, dem ein Element zugefügt werden soll</param>
/// <param name="Value">Das hinzuzufügende Element</param>
/// <param name="Index">Die Position an der das Element eingefügt werden soll</param>
/// <returns>Ein neue Array</returns>
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();
}

/// <summary>
/// Fügt am Ende eines Arrays ein Element hinz
/// MyArr = MyArr.Add(Value, Index)
/// </summary>
/// <typeparam name="T">Typparameter</typeparam>
/// <param name="array">Das Array, dem ein Element zugefügt werden soll</param>
/// <param name="Value">Das hinzuzufügende Element</param>
/// <returns>Ein neues Array</returns>
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.

ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private void neuBut_Click(object sender, EventArgs e)        
{
   //Im Falle, dass pList ein Array ist 
   pList = pList.Add(new Person());
   //Im Falle, dass pList eine Collection ist
   pList.Add(new Person());

   //und dann dein restlicher Code
   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:

ausblenden 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:

ausblenden C#-Quelltext
1:
accSource.Add(newPerson.spitzName);					



ich hoffe mal, das hilft dir ein wenig
Sibastschen Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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