with form example ejemplos data c# winforms datagridview

form - fill datagridview c#



DataGridViewComboBoxColumn no abre el menĂº desplegable al primer clic (2)

Antes de que nadie marque esto como duplicado, tenga en cuenta que esto no es lo mismo que las preguntas formuladas aquí , aquí y aquí .

Cuando tiene dos o más DataGridViewComboBoxColumn en su DataGridView y uno de ellos tiene su menú desplegable actualmente abierto, al hacer clic en el botón desplegable de una columna diferente no se abre ese menú desplegable. En su lugar, debe hacer clic dos veces. El primer clic se consume ocultando el menú desplegable ya abierto y el segundo clic abre el menú desplegable en el que hace clic.

Tenga en cuenta que se requieren dos clics cuando el modo EditOnEnter está activado; de lo contrario, tendrá que realizar tres clics para hacer esto. También probé el evento ContentClick sin obtener ningún beneficio.

Entonces, ¿cómo puedo usar la operación con un solo clic en los casos en que tengo más de un DataGridViewComboBoxColumn en mi grilla?

Actualizar

En caso de que alguien quiera reproducirlo, aquí está el proceso:

  1. Cree un nuevo proyecto WinForms C #.
  2. Vaya al código de Form1 y péguelo en el constructor después de la línea InitializeComponent :

    DataGridView dgv = new DataGridView(); DataGridViewComboBoxColumn col1 = new DataGridViewComboBoxColumn(); DataGridViewComboBoxColumn col2 = new DataGridViewComboBoxColumn(); dgv.Columns.AddRange(new DataGridViewColumn[] { col1, col2 }); dgv.Dock = DockStyle.Fill; dgv.EditMode = DataGridViewEditMode.EditOnEnter; col1.Items.AddRange(new object[] { "Cat", "Dog", "Elephant", "Lion" }); col2.Items.AddRange(new object[] { "Duck", "Hen", "Crow", "Sparrow" }); this.Controls.Add(dgv);

  3. Ejecute el proyecto. Haga clic en el primer menú desplegable, luego haga clic en el otro menú desplegable sin cerrar el primero. Se necesitarán 2 o 3 clics (dependiendo de dónde haga clic en el segundo menú desplegable) para abrir la segunda lista.


No hay nada malo con tu código. Este es el comportamiento diseñado para el control .NET DataGridView.

Si hace clic en el botón (la flecha hacia abajo) en el lado derecho del control desplegable en lugar de en el área de texto, la lista desplegable se mostrará enseguida: 1 clic .

Si hace clic en el área de texto del control desplegable, primero obtendrá el foco y luego mostrará la lista desplegable: 2 clics .

Si en este momento se expande otra lista desplegable, se necesitaría un clic adicional para colapsarla, es decir, 3 clics .

Hay un par de soluciones para mejorar este comportamiento. Eche un vistazo a esta discusión de MSDN. En mi humilde opinión, este tipo de alteraciones no valen la pena, pero depende de ti decidir lo que mejor se adapte a tu proyecto.

Atentamente.


Esto parece funcionar para mí:

Establezca EditMode en EditProgramatically

Codifique el evento CellMouseClick :

private void dgv_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { // maybe do a column type check before..!? dgv.BeginEdit(false); var ec = dgv.EditingControl as DataGridViewComboBoxEditingControl; if (ec != null && ec.Width - e.X < SystemInformation.VerticalScrollBarWidth ) ec.DroppedDown = true; }

Cerrar un cuadro desplegable que aún se va a comer seguirá siendo un moseclick, pero así es como debería ser, imo.