2010-04-21 19 views
7

Usar winforms en vs2008. Tengo un DataGridView y me gustaría detectar cuándo está visible la barra de desplazamiento vertical. ¿Para qué evento debo registrarme?Cómo detectar la barra de desplazamiento vertical en un control DataGridView

Estoy agregando la suma de cada valor de celda en la última columna de la cuadrícula y mostrando ese valor en un cuadro de texto en la parte inferior de DataGridView.

Me gustaría que este cuadro de texto se mantenga alineado con los valores de celda (los he alineado correctamente ya que son $$) incluso después de que la barra de desplazamiento esté presente.

Respuesta

8

Anular el comportamiento de DGV suele ser un gran dolor en el cuello. Aunque esto va bastante rápido. Agregue una nueva clase a su formulario y pegue el código que se muestra a continuación. Compilar. Coloque el nuevo control desde la parte superior de la barra de herramientas en un formulario. Implementar el evento ScrollbarVisibleChanged.

using System; 
using System.Windows.Forms; 

class MyDgv : DataGridView { 
    public event EventHandler ScrollbarVisibleChanged; 
    public MyDgv() { 
     this.VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged); 
    } 
    public bool VerticalScrollbarVisible { 
     get { return VerticalScrollBar.Visible; } 
    } 
    private void VerticalScrollBar_VisibleChanged(object sender, EventArgs e) { 
     EventHandler handler = ScrollbarVisibleChanged; 
     if (handler != null) handler(this, e); 
    } 
} 
+0

Ay que parece ser un dolor sólo para detectar cuando una columna se ha cambiado el tamaño debido a la barra de desplazamiento: mismas obras para la barra de desplazamiento horizontal (sustituir con VScrollBar HScrollBar). – Billy

+4

@Billy: siempre es un error no decir por qué realmente necesita algo. Utilice el evento ColumnWidthChanged de DGV. –

0

creo HAY ningún caso para eso ... pero se puede tratar con algo como esto en todos los lugares donde la red puede crecer:

  • obtener el número de filas en reales el gridview + el encabezado
  • Multiplica ese número por el alto de cada fila
  • Si el resultado es mayor que el alto del DataGrid, debe haber una barra de desplazamiento vertical.
0

Le di a Hans Passant la marca de verificación desde que respondió la pregunta ... Sin embargo, hice otra ruta para encontrar la solución. Como el cuadro de diálogo es modal, la lista de elementos no cambiará desde el momento en que se creó. Así que puedo llamar al código siguiente para asegurarme de que los cuadros de texto están en la ubicación correcta cuando se muestra el cuadro de diálogo por primera vez.

/// <summary> 
    /// Horizontally shifts the label and text boxes that display the total 
    /// values so that the totals remain aligned with the columns. 
    /// </summary> 
    private void ShiftTotalsDisplay(DataGridView grid, Label firstLabel, 
    TextBox secondTextBox, TextBox thirdTextBox) 
    {   
    //Note if you have a rowheader add the width here also. 
    int nameRightLoc = grid.Location.X +    
     grid.Columns[0].Width; 
    int fpRightLoc = nameRightLoc + 
     grid.Columns[0].DividerWidth + 
     grid.Columns[1].Width; 
    int dlRightLoc = fpRightLoc + 
     grid.Columns[1].DividerWidth + 
     grid.Columns[2].Width; 

    Point loc = firstLabel.Location; 
    loc.X = nameRightLoc - firstLabel.Width - 2; 
    firstLabel.Location = loc; 

    loc = secondTextBox.Location; 
    loc.X = fpRightLoc - secondTextBox.Width - 2; 
    secondTextBox.Location = loc; 

    loc = thirdTextBox.Location; 
    loc.X = dlRightLoc - thirdTextBox.Width - 2; 
    thirdTextBox.Location = loc;   
    } 
20
var vScrollbar = dataGridView1.Controls.OfType<VScrollBar>().First(); 
if (vScrollbar.Visible) 
{ 
} 
+0

Gracias por agregar el awser. ¡Actualmente estoy aprendiendo Linq y amo el poder que proporciona! – Billy

+1

Esta debería ser la respuesta aceptada. Estoy usando esto ahora para cambiar el tamaño de mi formulario hasta que desaparezcan las barras de desplazamiento. –

0

Si su vgd está dentro de un panel entonces se puede comparar paneles y altura vgd propiedades. Si el dgv es más grande que el panel, entonces debe haber una barra de desplazamiento, ¿verdad?

igual:

int panel_height = pnl.Height; 
int dgv_height = (dgv.RowCount + 1) * 24; // You can play around with this 24 according to your cell styles 
if (dgv_height > panel_height) MessageBox.Show("Voila!"); 
0

Establecer propiedad de "AutoSizeMode" DGV la última de la columna de "relleno" y establezca la propiedad Width del cuadro de texto igual a dgv.Columns [ "lastcolumn"] Ancho..

1

En lugar de utilizar Linq (Adam Butler), puede recorrer los controles e inscribir un controlador de eventos que se llamará cada vez que cambie la visibilidad de la barra de desplazamiento. He implementado esa manera y funciona bastante bien:

private System.Windows.Forms.DataGridView dgCounterValues; 
private Int32 _DataGridViewScrollbarWidth; 

// get vertical scrollbar visibility handler 
foreach (Control c in dgCounterValues.Controls) 
if (c.GetType().ToString().Contains("VScrollBar")) 
{ 
    c.VisibleChanged += c_VisibleChanged; 
} 

hacer esto en algún lugar después de la InitializeComponent() En el controlador, hacer lo que tiene que hacer en respuesta al cambio de la visibilidad de la barra de desplazamiento vertical. se muestran

void c_VisibleChanged(object sender, EventArgs e) 
{ 
    VScrollBar vb = sender as VScrollBar; 
    if (vb.Visible) _DataGridViewScrollbarWidth = vb.Width; 
    else _DataGridViewScrollbarWidth = 0; 
} 
+0

Código útil para aquellos que tienen una versión pre-Linq de .Net. Sin embargo, sugeriría 'if (c.GetType(). Equals (typeof (VScrollBar)))' como una mejor comparación de igualdad que usando 'ToString()'. Además, una declaración de "pausa" en el foreach lo haría aún mejor. – JPProgrammer

Cuestiones relacionadas