none
DataGridViewComboBox beim Klicken sofort öffnen RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein DataGridView mit zwei Spalten. Die erste Spalte beinhaltet einen Text zur Beschreibung, die zweite eine ComboBox. Ich hab jetzt immer den unschönen Effekt, dass ich zum Öffnen der DataGridViewComboBox, mehrmals auf die Spalte klicken muss. Für mich sieht es so aus, als ob beim ersten Klick, die DataGridView-Zeile zuerst einmal selektiert wird, danach abhängig davon, ob ich bei der ComboBox mitten rein klicke oder auf den Pfeil, entweder die ComboBox nochmals den Fokus bekommt und sich dann öffnet.

    Kann man das nicht etwas usabilityfreundlicher hinbekommen? Ich würde als User eigentlich erwarten, dass die ComboBox sofort aufgeklappt wird, wenn ich auf die zweite DataGridViewComboBox-Spalte klicke. Geht das irgendwie?

    Dienstag, 5. Oktober 2010 13:15

Antworten

  • Hallo S.,

    Du könntest z.B. im CellClick-Ereignishandler das gehostete DataGridViewComboBoxEditingControl "aufklappen": 

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
      if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn)
      {
        dataGridView1.CurrentCell = (DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];
        dataGridView1.BeginEdit(true);
        ((DataGridViewComboBoxEditingControl)dataGridView1.EditingControl).DroppedDown = true;
      }
    }
    
    

    DataGridViewComboBoxEditingControl-Klasse:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcomboboxeditingcontrol(v=VS.100).aspx

    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 6. Oktober 2010 06:53
    Dienstag, 5. Oktober 2010 17:52
    Moderator

Alle Antworten

  • Hallo S.,

    Du könntest z.B. im CellClick-Ereignishandler das gehostete DataGridViewComboBoxEditingControl "aufklappen": 

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
      if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn)
      {
        dataGridView1.CurrentCell = (DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];
        dataGridView1.BeginEdit(true);
        ((DataGridViewComboBoxEditingControl)dataGridView1.EditingControl).DroppedDown = true;
      }
    }
    
    

    DataGridViewComboBoxEditingControl-Klasse:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcomboboxeditingcontrol(v=VS.100).aspx

    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 6. Oktober 2010 06:53
    Dienstag, 5. Oktober 2010 17:52
    Moderator
  • Hallo Marcel,

    ahhh, so geht das. Das mit dem DataGridViewComboBoxEditingControl war mir nicht klar. Jetzt ist das genau so, wie man das User erwarten würde! Danke für die Hilfe!

    Mittwoch, 6. Oktober 2010 06:54
  • Hallo SP.,

    ich war jetzt eine Zeit nicht Online. Deswegen etwas verspätet:
    Kurz dazu:

    Oft benutzen die Leute hier die einfachere Variante:

        dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;

    [DataGridViewEditMode-Enumeration (System.Windows.Forms)]

     


    ciao Frank
    Mittwoch, 6. Oktober 2010 17:37
  • Hallo Frank,

    > SP schrieb: Ich würde als User eigentlich erwarten, dass die ComboBox sofort aufgeklappt wird, wenn ich auf die zweite DataGridViewComboBox-Spalte klicke

    >Frank: Oft benutzen die Leute hier die einfachere Variante: [...] EditOnEnter [...]

    Wenn's so einfach ist: Wie soll das gehen? - Soviel ich weiß, braucht man mit EditOnEnter einen Klick um die Zelle in den Bearbeitungsmodus zu versetzen und einen zweiten, um die gehostete ComboBox aufzuklappen. Oder?

    Gruß
    Marcel

    Donnerstag, 7. Oktober 2010 07:00
    Moderator
  • Hallo Marcel,

    man benötigt nur einen Klick, keinen zweiten. Hier etwas zum Verifizieren:

       dataGridView1.AllowUserToAddRows = false;
       dataGridView1.AllowUserToDeleteRows = false;
       dataGridView1.Columns.Add("Spalte1", "Spalte1");
       DataGridViewComboBoxColumn spalte2 = new DataGridViewComboBoxColumn();
       spalte2.Name = "Spalte2"; spalte2.HeaderText = "Spalte2";
       DataTable dt = new DataTable();
       dt.Columns.Add("ID", typeof(int));
       dt.Columns.Add("Anzeige");
       dt.Rows.Add(4, "WertA"); dt.Rows.Add(6, "WertB");
       dt.Rows.Add(22, "WertC"); spalte2.DataSource = dt;
       spalte2.DisplayMember = "Anzeige";
       spalte2.ValueMember = "ID";
       dataGridView1.Columns.Add(spalte2);
       dataGridView1.Rows.Add("Wert1", 4);
       dataGridView1.Rows.Add("Wert3", 6);
       dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
    
    

     ... das ist ja gerade ein Vorteil dieses einfacheren Edit-Modes.


    ciao Frank
    Donnerstag, 7. Oktober 2010 07:43
  • Hallo Frank,

    man benötigt nur einen Klick, keinen zweiten

    Das geht leider nur wenn man direkt auf die DropDown-Schaltfläche klickt. Klickt man aber einfach irgendwo in einer Zelle der DataGridViewComboBox-Spalte (Anforderung von SPDeveloperXP, s. oben), braucht man mit EditOnEnter zwei und mit meinem Code nur einen Klick. Das ist eben der kleine Unterschied. Nicht dass es wichtig wäre.

    Gruß
    Marcel

    Donnerstag, 7. Oktober 2010 08:32
    Moderator
  • Marcel,

    nicht "leider", sondern viel sauberer (einfacher) und gemäß Windows-Richtlinien mit EditOnEnter. Es wäre ein Fehler, wenn ein DropDown kommt, wenn man nicht auf den DropPfeil der ComboBox klickt (sondern woanders). Das ist auch bei der Standard ComboBox so wie in meiner Empfehlung.

    Zwar sehe ich auch in seiner Original-Frage das "mittenrein-Klicken" zumindest ~thematisiert, würde mich da aber immer an die Windows-Standards halten (also ein Mitte-Klick: markieren, und DropDown: eben das DropDown mit einem Klick!).
    Es ist ja nur einem Klick (auf den DropDown) bei EditOnEnter möglich.


    ciao Frank
    Donnerstag, 7. Oktober 2010 11:15
  • Hallo Frank,

    nicht "leider", sondern viel sauberer (einfacher) und gemäß Windows-Richtlinien mit EditOnEnter. Es wäre ein Fehler, wenn ein DropDown kommt, wenn man nicht auf den DropPfeil der ComboBox klickt (sondern woanders).

    so pauschal stimmt das leider nicht. Eine Standard ComboBox mit dem DropDownStyle = ComboBoxStyle.DropDownList hat keinen markierbaren Textbereich und öffnet die Liste auch dann, wenn man nicht direkt auf den Drop Pfeil klickt. Die ComboBox im DataGridView implementiert nur den Stil DropDownList, daher kann man auch erwarten, dass die Liste öffnet, wenn man einfach in die Zelle klickt.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 7. Oktober 2010 11:35
    Beantworter
  • Hallo Thorsten,

    die ComboBox im DataGridView implementiert die ComboBox standardmäßig so, dass bei Klick in die Zelle (Mitte) oder Wert markiert wird (nicht die DropDown Liste aufgeht). Auf keinen Fall solte hier also standardmäßig die ComboBox das DropDown ausführen. Das ist als Standard-Verhalten auch prüfbar, wenn Du das EditOnEnter in meinem Code nicht setzt. 

    Ich kann zwar auch den Wunsch verstehen, dass man das mal anders haben möchte (also als DropDownList-Verhalten). Ich fände das schon aus Usability-Gründen nicht schön, es ist ja eben auch das vom User erwartete Verhalten (ohne DropDown, da Standard), insofern fände ich es ideal, dass es nur über den DropDown-Button aktiviert wird. Microsoft wohl mit dem EditOnEnter wohl auch.
    Solche Click-Überschreibungen gehen eh meistens an den Standards vorbei.


    ciao Frank
    Donnerstag, 7. Oktober 2010 13:06