none
"DataGridViewComboboxColumn" Nächsten Eintrag verhindern?! RRS feed

  • Frage

  • Guten Morgen liebe Community,

    kurz zu meiner Person da dies meine erste Frage ist.

    Ich bin zur Zeit Azubi (Fachinformatiker in AE) und arbeite für ein Unternehmen deren Softwarelösungen auf WindowsForms basieren. (Programmiersprache: C#, Programmiertool: VisualStudio 2010).

    In dem Zusammenhang habe ich irgendwann mal ein DataGridView und endsprechende Columns erstellt, die auf die Funktionalitätswünsche unserer Kunden ausgerichtet wurden.

    Problemstellung:

    Zur Zeit ist es so, das die Comboboxen in den DataGridViews über eine DataSource (DataTable) gefüllt werden. Sobald man sich in einer Zeile befindet und einen Eintrag via Autovervollständigung in der ComboboxCell auswählt und in die nächste Zeile wechselt, bekommt man als Vorschlagswert den nächst passenden Eintrag nach dem zuvor autovervollständigeten Eintrag.sd

    Bsp:

    | Klimper| Klimper1| Klimper2 |      stehen in der DataSource zur Verfügung

    |K  (Vorschlagswert: Klimper) Es wurde "K" in der DataRow eingegeben

    |K  (Vorschlagswert: Klimper1) Es wurde ein weiteres mal "K" in der DataRow eingegeben

    Frage:

    Was muss ich der DataGridViewComboboxColumn zuweisen (Eigenschaft/Methodenüberschreibeung/Events abgreifen) damit diese anstelle des folgenden Eintrages einfach wieder den 1. zutreffenden vorschlägt?

    Freitag, 19. April 2013 07:22

Antworten

Alle Antworten

  • Hallo,

    was ich verstanden habe ist, dass Du in der nachzuschlagenden Tabelle diese Werte: Klimper, Klimper1, Klimper2 drin hast. Ist es nun so, dass du, wenn du den eigentlichen Datensatz wechselst (also nicht den nachzuschlagenden), dass er dann trotzdem die ComboboxCell nicht initialisiert und deshalb auch dann sich so verhält als stünde er noch auf dem gleichen und deshalb den nächsten Eintrag zur Autovervollständigung vorschlägt?

    => Etwas SourceCode von Dir wäre hier hilfreich...

    => Ich habe so eine DataGridViewComboBoxColumn z.B. so angebunden:

    DataGridViewComboBoxColumn dgVcbCChronikArt = new DataGridViewComboBoxColumn();
    dgVcbCChronikArt.Name = "ChronikArt";
    dgVcbCChronikArt.DataSource = dsPIS.Tables["ChronikArt"].DefaultView; // Nachzuschlagende Tabelle
    dgVcbCChronikArt.DataPropertyName = "ChronikArtID"; // In welches Feld wird im Dataset gespeichert (welches Dataset Feld wird angebunden?)
    dgVcbCChronikArt.DisplayMember = "ChronikArt"; // Welches Feld wird aus der nachzuschlagenden Tabelle ANGEZEIGT
    dgVcbCChronikArt.ValueMember = "ChronikArtID"; // Welches Feld wird aus der nachzuschlagenden Tabelle GESPEICHERT
    dgVcbCChronikArt.HeaderText = "ChronikArt"; // Welchen Titel soll das Feld im Datagridview haben?
    dgVcbCChronikArt.SortMode = DataGridViewColumnSortMode.Automatic;
    dGVChronik.Columns.Add(dgVcbCChronikArt);

    HTH

    Gruß,

    Christoph

    • Bearbeitet chris_rall Dienstag, 23. April 2013 15:15
    Dienstag, 23. April 2013 15:11
  • Erstmal danke für die Antwort und die Bereitstellung des Codes wird auch prompt nachgereicht.

    //Deklarieren einer CBO
    //Alle übergebenen Parameter beeinflussen nicht das Standartverhalten der CBO, um das es ja auch geht
    
    var dcAbrechnungsobjekt = 
    new ks_DGVCombobox(true, "Abrechnungsobjekt", "Bitte wählen Sie ein Abrechnungsobjekt aus"
    , DBClient(), "idf_KVP_Abrechnungsobjekte", 225)
               {
                Name = "idf_KVP_Abrechnungsobjekte"
               };
    
    //Füllen der CBO
    //Das Befüllen erfolgt durch einen Connect auf einen Datenbank, zusätzlich wird der Displaymember und Valuemember übergeben
    
    dcAbrechnungsobjekt.comboboxFuellen(
    SqlBefehl.Steuerelemente_ks_ComboBox_AbrechnungsobjekteVerdichtungsebene(), 
    "idx_KVP_Abrechnungsobjekte", "Bezeichnung",                                                    new DBParameter("@idf_KVP_Verdichtungsebenen", cboVerdichtung.SelectedValue.ToString()));
    
    //Aufgerufende Funktion
    public void comboboxFuellen(string sql, string valueMember, string displayMember, DBParameter param)
            {
                dataTable = nummerkreisDatenmanager.DataTableHolenReadOnly(sql,param);
                DataSource = dataTable;
                ValueMember = valueMember;
                DisplayMember = displayMember;
                DropDownWidth = 400;
                DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
            }
    
    //Anbringen an das DGV
    dgvObjekt.Columns.Add(dcAbrechnungsobjekt);

    Das ist alles was mit den DataGridViewComboboxen geschieht.

    Ich versuch das konkrete Problem vielleicht mal mit einem Screenshot verständlicher zu beschreiben:

    (ich darf keine bilder/links eifügen also so:  social.msdn.microsoft.com/Forums/getfile/276047)

    (Sorry)

    Betätigt man in der 1. Zeile (kann auch eine andere sein) die Taste "1", so erhält man den 1. zutreffenden Eintrag in der DataSource der Combobox.

    Wenn ich nun die Zeile wechsel und ein weiteres mal die Taste "1" betätige, erhält man den 1. zutreffenden Datensatz nachdem Vorherigen.  

    Und dieses Verhalten würde ich gerne umgehen, die Combobox soll stattdessen immer den 1. Eintrag aus der DataSource "vorschlagen/vervollständigen" und nicht basierend auf der letzten Eingabe.



    • Bearbeitet _Cogeck_ Mittwoch, 24. April 2013 07:31 test
    Mittwoch, 24. April 2013 07:29
  • Hallo,

    ich denke, ich habe das Fehlverhalten verstanden.

    Aber du musst doch die AutoComplete Eigenschaft der DataGridViewComboBoxColumn irgendwo setzen? Wo tust du das?

    => http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcomboboxcolumn.autocomplete.aspx

    Vielleicht hilft Dir dieser Thread, so sollte es gemacht werden, ist zwar VB, sollte aber nicht zu schwierig sein, das nach C# zu portieren.

    => http://social.msdn.microsoft.com/Forums/de-DE/vbgeneral/thread/2bbd3d57-5f7e-4842-a73e-3092a1507455

    Oder habe ich Dich doch falsch verstanden?

    Gruß,

    Christoph

    • Bearbeitet chris_rall Donnerstag, 25. April 2013 07:12 Tippfehler
    • Als Antwort markiert _Cogeck_ Montag, 29. April 2013 05:50
    Donnerstag, 25. April 2013 07:06
  • Danke für die Hilfe!

    Ich hatte zwar die AutoComplete Eigenschaft gesetzt bin aber durch deinen Hinweis erstmals darauf gekommen das es dort vllt noch mehr geben könnte als nur diese Eigenschaft :)

    Der VB Code konnte fast 1 zu 1 übernommen werden und hat das unerwünschte Verhalten aufgehoben.

    Für jeden den es noch interessiert der Code sieht jetzt wie folgt aus:

    private void ksEditingControlShowing(Object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                try
                {
                  ComboBox nullCheck = e.Control as ComboBox;
                  if (nullCheck != null)
                  {
                    ComboBox combo = (ComboBox)e.Control;
                    ((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown;
                    ((ComboBox)e.Control).AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                    ((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems;
                  }             
                }
                catch (Exception ex) { }
            }

    Nochmals vielen Dank :)

    Montag, 29. April 2013 05:53