2010-04-21 17 views
7

Utilizzo di winform in vs2008. Ho un DataGridView e vorrei rilevare quando la barra di scorrimento verticale è visibile. A quale evento dovrei registrarmi?Come rilevare la barra di scorrimento verticale in un controllo DataGridView

Aggiungo sommando il valore di ogni cella nell'ultima colonna della griglia e visualizzando quel valore in una casella di testo nella parte inferiore di DataGridView.

Vorrei che questa casella di testo fosse allineata con i valori della cella (li ho resi allineati a destra poiché si tratta di valori $$) anche dopo che la barra di scorrimento è presente.

risposta

8

L'override del comportamento DGV è solitamente un enorme dolore al collo. Comunque, è andata abbastanza velocemente. Aggiungi una nuova classe al modulo e incolla il codice mostrato di seguito. Compilare. Rilasciare il nuovo controllo dalla parte superiore della barra degli strumenti in un modulo. Implementa l'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

Ouch che sembra essere un dolore solo per rilevare quando una colonna è stata ridimensionata a causa della barra di scorrimento viene mostrato. – Billy

+4

@Billy: sempre un errore non dire perché hai davvero bisogno di qualcosa. Utilizzare l'evento ColumnWidthChanged del DGV. –

0

Penso Theres nessun caso per questo ... ma si può provare con qualcosa di simile in tutti i luoghi in cui la rete può crescere:

  • ottenere il numero di righe effettive in GridView + Intestazione
  • Moltiplicare quel numero in base all'altezza di ogni riga
  • Se il risultato è maggiore dell'altezza di DataGrid, deve esserci una barra di scorrimento verticale.
0

Ho dato a Hans Passant il segno di spunta da quando ha risposto alla domanda posta ... Tuttavia, ho fatto un altro percorso per la soluzione. Poiché la finestra di dialogo è modale, l'elenco degli elementi non cambierà dal momento in cui è stato creato. Quindi sono in grado di chiamare il codice qui sotto per garantire che le caselle di testo siano nella posizione corretta quando viene visualizzata per la prima volta la finestra di dialogo.

/// <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

Grazie per aver aggiunto l'anser. Attualmente sto imparando Linq e amo il potere che fornisce! – Billy

+1

Questa dovrebbe essere la risposta accettata. Sto usando questo ora per ridimensionare il mio modulo fino a quando le barre di scorrimento non scompaiono. –

0

Se il DGV è all'interno di un pannello, quindi è possibile confrontare le proprietà del pannello e altezza DGV. Se dgv's è più grande di panel, deve esserci una barra di scorrimento, giusto?

come:

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

Impostare la proprietà l'ultima colonna DGV "AutoSizeMode" per "riempire" e impostare la proprietà Width del TextBox pari a dgv.Columns [ "lastColumn"] Larghezza..

1

Invece di utilizzare Linq (Adam Butler), è sufficiente scorrere i controlli e registrare un gestore di eventi che verrà chiamato ogni volta che la visibilità della barra di scorrimento cambia. Ho implementato in questo modo e funziona abbastanza liscio:

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; 
} 

fare questo da qualche parte dopo l'InitializeComponent() Nel gestore, fare tutto ciò che è necessario fare in risposta al cambiamento visibilità della barra di scorrimento verticale. Stesse opere per la barra di scorrimento orizzontale (sostituire VScrollBar con HScrollBar):

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

Codice utile per coloro che hanno una versione pre-Linq di .Net. Vorrei comunque suggerire 'if (c.GetType(). Equals (typeof (VScrollBar)))' come migliore confronto di uguaglianza che usare 'ToString()'. Anche un'istruzione 'break' nel foreach lo renderebbe ancora migliore. – JPProgrammer

Problemi correlati