2010-11-28 20 views
5

Después de configurar "EditOnEnter" para que sea verdadero, el DataGridViewComboBoxCell aún tarda dos clics en abrirse si no hago clic en la parte de la flecha hacia abajo del cuadro combinado.¿Cómo obtengo los cuadros combinados DataGridView para mostrar su lista desplegable con un solo clic?

¿Alguien tiene alguna pista de cómo solucionar esto? Tengo mi propia clase DataGridView que uso, por lo que puedo solucionar fácilmente este problema en todo el sistema con algunos manejadores de eventos inteligentes, espero.

Gracias.

Respuesta

5

Como usted ya tiene EditMode propiedad del DataGridView 's se ajusta a 'EditOnEnter', sólo puede anular su método OnEditingControlShowing para asegurarse de que la lista desplegable se muestra tan pronto como un cuadro combinado recibe el foco:

public class myDataGridView : DataGridView 
{ 

    protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e) 
    { 
     base.OnEditingControlShowing(e); 

     if (e.Control is ComboBox) { 
      SendKeys.Send("{F4}"); 
     } 
    } 

} 

Cuando un control de edición en su control DataGridView obtiene el foco de entrada, el código anterior comprueba si se trata de un cuadro combinado. Si es así, es virtually "presses" la tecla F4, que hace que la porción desplegable se expanda (¡pruébela cuando cualquier cuadro combinado tenga el foco!). Es un poco complicado, pero funciona como un encanto.

+0

ya tengo un montón de hacks '' de esa clase DataGridView mío. Uno más no va a doler. Voy a probar esto hoy. –

+0

¡lo de arriba era mi gato! –

+0

¡Funciona realmente como un amuleto! –

0

Para evitar los problemas de SendKeys, pruebe la solución de Open dropdown(in a datagrid view) items on a single click. Esencialmente, en el enlace OnEditingControlShowing para el evento Enter del cuadro combinado, en el controlador de eventos Enter, establezca ComboBox.DroppedDown = true. Eso parece tener el mismo efecto, pero sin los efectos secundarios que menciona @Cody Gray.

3

que utilizan esta solución, ya que evita las pulsaciones de teclado que envía:

reemplazar el método OnCellClick (si va a crear subclases) o suscribirse al evento CellClick (si va a alterar la DG V de otro objeto más que como una subclase).

protected override void OnCellClick(DataGridViewCellEventArgs e) 
{ 
    // Normally the user would need to click a combo box cell once to 
    // activate it and then again to drop the list down--this is annoying for 
    // our purposes so let the user activate the drop-down with a single click. 
    if (e.ColumnIndex == this.Columns["YourDropDownColumnName"].Index 
     && e.RowIndex >= 0 
     && e.RowIndex <= this.Rows.Count) 
    { 
     this.CurrentCell = this[e.ColumnIndex, e.RowIndex]; 
     this.BeginEdit(false); 
     ComboBox comboBox = this.EditingControl as ComboBox; 
     if (comboBox != null) 
     { 
      comboBox.DroppedDown = true; 
     } 
    } 

    base.OnCellContentClick(e); 
} 
+0

Buena. ¡Resuelve el problema! – AKN

1
protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e) 
    { 
     base.OnEditingControlShowing(e); 
     DataGridViewComboBoxEditingControl dataGridViewComboBoxEditingControl = e.Control as DataGridViewComboBoxEditingControl; 
     if (dataGridViewComboBoxEditingControl != null) 
     { 
      dataGridViewComboBoxEditingControl.GotFocus += this.DataGridViewComboBoxEditingControl_GotFocus; 
      dataGridViewComboBoxEditingControl.Disposed += this.DataGridViewComboBoxEditingControl_Disposed; 
     } 
    } 

    private void DataGridViewComboBoxEditingControl_GotFocus(object sender, EventArgs e) 
    { 
     ComboBox comboBox = sender as ComboBox; 
     if (comboBox != null) 
     { 
      if (!comboBox.DroppedDown) 
      { 
       comboBox.DroppedDown = true; 
      } 
     } 
    } 

    private void DataGridViewComboBoxEditingControl_Disposed(object sender, EventArgs e) 
    { 
     Control control = sender as Control; 
     if (control != null) 
     { 
      control.GotFocus -= this.DataGridViewComboBoxEditingControl_GotFocus; 
      control.Disposed -= this.DataGridViewComboBoxEditingControl_Disposed; 
     } 
    } 
+0

Una pequeña explicación de su respuesta sería útil. – Popo

Cuestiones relacionadas