2011-12-26 25 views
14

He encontrado un error (supongo) en .NET 3.5. Al agregar filas a un DataGridView utilizando Rows.Add(), mientras el DGV está desactivado, la barra de desplazamiento vertical no se actualiza correctamente. En consecuencia, no puede desplazarse hasta la parte inferior de la DGV utilizando la barra de desplazamiento o la rueda del mouse después de volver a habilitar el DGV (navegar con las teclas de flechas aún funciona)Barra de desplazamiento vertical de DataGridView no se está actualizando correctamente (¿Error de forma?)

Así que estoy buscando una solución. ¿Hay alguna manera de forzar a la barra de desplazamiento a actualizar sus límites o puede ingresar manualmente un nuevo valor máximo? Prefiero no tener que volver a llenar el DGV.

*) En realidad, es la forma primaria deshabilitada, pero supongo que el problema es que se propaga al control DGV.

Respuesta

13

Acabo de tener este problema (mi formulario estaba deshabilitado al agregar filas) y lo resolví estableciendo la propiedad de la barra de desplazamiento de la grilla en 'Ninguno' antes de agregar las filas y luego volver a establecerlas en 'Ambos' filas han sido agregadas

+0

Todavía una chapuza, pero un poco mejor. Gracias. :) – ReturningTarzan

+0

¡Súper! Sálvame))) – Konstantin

+1

Esto funciona muy bien, pero simplemente llama a 'PerformLayout()' después de que 'SetDataSource' también funcione. –

0

En realidad, acabo de encontrar una solución, pero no me gusta. Después de que el DGV esté habilitado, puede hacer esto:

int x = Rows.Add(); 
Rows.RemoveAt(x); 

Y luego se actualiza la barra de desplazamiento. Pero no es muy bonito, causa un pequeño parpadeo molesto, y podría desencadenar algunos eventos que tendría que ignorar deliberadamente. Dejaré la pregunta abierta por un tiempo con la esperanza de una mejor solución.

18

Esto también soluciona el problema para mí:

DataGridView.SuspendLayout(); 
DataGridView.ResumeLayout(); 

Puede ser llamado antes de que se volverán a habilitar la DGV.


UPDATE: Esto también hace el trabajo:

DataGridView.PerformLayout(); 
+0

Tuve un problema con las barras de desplazamiento deshabilitadas con autosizemode.fill, haciendo la ejecución de la función después de cambiar el contenido que también trabajé para mí. ¡Gracias! ¡Salvaste mi día! – MazarD

+0

¡Gracias! Su funcionamiento – Raj

+2

Esta debería ser la respuesta aceptada. Me ayudó también. ¡Gracias! –

0

Se observó que, cuando el ancho y la altura del DataGridView1 se compararon con la anchura y la altura de la forma, y ​​la anchura y altura se restablecieron si excedieron las dimensiones del formulario, las barras de desplazamiento se hicieron visibles.

Prueba el siguiente código, que agregará dinámicamente un control DataGridView a un formulario y crear una cuadrícula con los nombres de fila y los encabezados de columna:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     'Following code adds a Datagridview control to a Form dynamically 
     'Step 1. Add a textbox to a Form, and input the number of columns (ncol). (Note: in this example, ncol=nrow). 
     'Step 2. Set the Form's Windowstate property to Maximized 
     For Each cont As Control In Me.Controls 'remove DataGridView if it already exists on the Form 
      If TypeOf (cont) Is DataGridView Then 
       Me.Controls.Remove(cont) 
      End If 
     Next 
     Dim DataGridView1 As New DataGridView 'create new data grid view dynamically during run-time 
     Me.Controls.Add(DataGridView1) 'add the data grid view to the Form 
     Me.Refresh() 
     Dim i, nrow, ncol As Integer ' ncol=nrow -->this is a square grid 
     ncol = TextBox1.Text 
     nrow = ncol 'Note: add a second textbox to the form and input nrow if you don't want a square grid 
     DataGridView1.Visible = True 
     DataGridView1.Top = 100 
     DataGridView1.Left = 100 
     DataGridView1.Rows.Clear() 
     Do While DataGridView1.Columns.Count > 0 
      DataGridView1.Columns.RemoveAt(DataGridView1.Columns.Count - 1) 
     Loop 
     For i = 1 To ncol 
      DataGridView1.Columns.Add(i, "V" & i) 
     Next 
     DataGridView1.Width = ncol * 115 
     DataGridView1.Height = nrow * 22 + 45 
     If DataGridView1.Width > Me.Width - DataGridView1.Left Then DataGridView1.Width = Me.Width - DataGridView1.Left - 20 
     If DataGridView1.Height > Me.Height - DataGridView1.Top Then DataGridView1.Height = Me.Height - DataGridView1.Top - 50 
     DataGridView1.ScrollBars = ScrollBars.None 
     For i = 1 To nrow 
      DataGridView1.Rows.Add() 
      DataGridView1.Rows.Item(i - 1).HeaderCell.Value = "V" & i 
     Next 
     DataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) 
     Dim dgvColumnHeaderStyle As New DataGridViewCellStyle() 
     dgvColumnHeaderStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 
     DataGridView1.ColumnHeadersDefaultCellStyle = dgvColumnHeaderStyle 
     DataGridView1.AllowUserToAddRows = False 
     DataGridView1.ScrollBars = ScrollBars.Both 
     Me.WindowState = FormWindowState.Maximized 
    End Sub 
0

me gustaría añadir un comentario en el post original, pero aún no puedo (menos de 50 reputación).

He encontrado el mismo problema al eliminar filas. La barra de desplazamiento parece deshabilitada, no hay ningún control deslizante visible y las flechas son grises.
Intentaremos las soluciones alternativas descritas aquí y at this link (explicitly enable the scrollbars again) o simplemente mantener todo el DGV habilitado.
También, this link suggests the same workaround (explicitly enabling...) y lo llama funcionando.

0

Mi problema proviene de llamar a dgv.Add() en un hilo de usuario. Después de cambiar a llamar desde el hilo de interfaz de usuario en cambio, la barra de desplazamiento aparece y funcionaba normalmente:

 if (dataGridView1.InvokeRequired) 
     { 
      dataGridView1.Invoke((Action)(() => dataGridView1.Rows.Add(new String[] { abc, efg }))); 
     } 
     else 
     { 
      dataGridView1.Rows.Add(new String[] { calPoint, logUrl }); 
     } 
1

Si ninguno de los otros solución dada trabajó para usted, me encontré con un problema similar con barra de desplazamiento vertical en DataGridView.Pero el problema es que cada vez que el número de filas se extiende más allá de la altura de la vista de cuadrícula de datos, el desplazamiento vertical crea una interfaz de usuario en mal estado. Tipo de filas superpuestas entre sí.

Tenía un DataGridView enlazado a datos.

Estas son las cosas que probé pero no funcionó.

  1. Estableciendo la propiedad ScrollBars en None, modifique el origen de datos y establezca la propiedad ScrollBars en Both.
  2. Usando SuspendLayout, ResumeLayout y PerformLayout en varias combinaciones.
  3. Establezca el doble búfer para DataGridView mediante el método de extensión.

Por último, Configuración AutoSizeRowsMode a DataGridViewAutoSizeRowsMode.AllCells ha solucionado el problema para mí.

Si tiene un problema similar con el desplazamiento horizontal, creo que jugar con AutoSizeColumnsMode debería solucionar el problema.

0

medida que la corredera no estaba evaluando correctamente y que ocupaba la mayor parte de la barra de desplazamiento vertical mi solución fue -

DGV.height = DGV.Height + 1

DGV.Height = DGV.Height - 1

A continuación, el control deslizante se dimensionó correctamente

Pero ahora uso

DGV.PerformLayout

que también resuelve el problema

-2

Las dos últimas filas de mi DataGridView siempre estaban ocultas en mi WinForms. Podía desplazarme hacia ellos usando la tecla de flecha hacia abajo del teclado (pero todavía no veo en qué fila estaba realmente). La rueda del mouse y la flecha hacia abajo de la barra de desplazamiento tampoco llegarían a ellos. Solo con un pequeño conjunto de datos y maximizando el formulario podría ver las dos últimas filas.

Así es como solucioné el problema: coloqué DataGridView en un Panel. BAM!

También solucionó otro problema con DataGridView, que cuando redimensionaba los encabezados de una columna, aparecían líneas verticales extrañas en cualquier control de UI debajo de DataGridView. Era muy feo y poco profesional. Pero ahora también está arreglado.

0

Encontré tu publicación mientras buscaba una solución para el problema que estaba teniendo. Lo que encontré en mi Microsoft Surface (Win10) fue la incapacidad de desplazar verticalmente DataGridView a la última línea de una larga lista usando un gesto táctil (como flick). Con frecuencia, la última línea era enloquecedoramente difícil de conseguir. La solución fue simple, pero me tomó un tiempo darme cuenta. Lo dejo aquí en caso de que sea útil.

// Override WndProc in your custom class inherited from DataGridView 
protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
    case 0x115:// WM_VSCROLL 
     // The low-order word holds the command 
     uint cmd = ((uint)m.WParam & (uint)0x0000FFFF); 
     switch (cmd) 
     { 
     case 5: // SB_THUMBTRACK 
      if (Rows.Count > 0) 
      { 
      // The high-order word holds the position 
      uint pos = ((uint)m.WParam & (uint)0xFFFF0000) >> 16; 

      // SAVE: This would give us the "true" ratio based on 100% 
      // SAVE: double ratio = (double)pos/(double)(VerticalScrollBar.Maximum - VerticalScrollBar.LargeChange); 
      // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%"); 

      // What we want is the ratio to the TOP of the thumb, BECAUSE 
      // THIS GIVES US THE RATIO TO THE FIRST LINE INDEX 
      double firstLineRatio = (double)pos/(double)(VerticalScrollBar.Maximum); 
      // We want to make it so that it shows the full line 
      // even if we just barely meet the ratio 
      double dFirstLine = firstLineRatio * Rows.Count; 
      int iFirstLine = (int)(dFirstLine + 0.9999); 
      // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%"); 
      FirstDisplayedScrollingRowIndex = iFirstLine; 
      // We do this INSTEAD OF the default for this message, so RETURN 
      return; 
      } 
      break; 
     } 
     break; 
    default: 
     break; 
    } 
    base.WndProc(ref m); 
} 
1

Mi problema es que mi barra de desplazamiento vertical desapareció por completo. Intenté con todas las sugerencias anteriores y finalmente descubrí que hacer que el panel que contiene DataGridView fuera más estrecho que el formulario resolvió el problema. En mi caso, 16 píxeles más angostos funcionaron.

0

Mi solución fue deshabilitar las barras de desplazamiento de sus propiedades. Luego habilítelos desde la línea de código después de inicializar la ventana. DataGridViewObj.ScrollBars = ScrollBars.Both

0

Para mí el problema fue que puse mi cuadrícula de datos en un TabPage que no se muestra durante el tiempo de generación de datos por lo que el srolling era deshecha.

encontré una era para hacer una actualización correcta con sólo diable automático/activar en cada cambio visibles:

public MyForm() 
{ 
    InitializeComponent(); 

    // Automatic scroll to bottom (it might not work if you try to do it without this event) 
    datagrid.RowsAdded += (sender, e) => 
    { 
     datagrid.FirstDisplayedScrollingRowIndex = datagrid.RowCount - 1; 
    }; 

    // WinForms bug fix: scrollbar update 
    datagrid.VisibleChanged += (sender, e) => 
    { 
     Enabled = false; 
     Enabled = true; 
    }; 
} 
Cuestiones relacionadas