2011-11-21 27 views
6

Quindi tutti conosciamo la funzionalità del clic e tenendo premuto il pulsante del mouse, quindi spostando il mouse sul bordo di una griglia e le colonne/righe scorrono e la selezione aumenta.Scorrimento di DataGridView con il mouse

Ho un controllo basato su DataGridView che ho dovuto disattivare MultiSelect e gestire personalmente il processo di selezione a causa di problemi di prestazioni, e ora anche la funzione di scorrimento di clic + attesa è disabilitata.

Qualche suggerimento su come procedere per riscrivere questa funzionalità?

Stavo pensando di utilizzare qualcosa di semplice come l'evento MouseLeave, ma non sono sicuro di come determinare la posizione che ha lasciato, oltre a implementare una velocità di scorrimento dinamica.

+0

Puoi essere più specifico con la tua domanda? Puoi mettere un pezzo di codice (se hai fatto qualcosa)? – Priyank

+0

Non ho ancora fatto nulla ... Speravo di ottenere alcune indicazioni (generali) su un modo ragionevole per avvicinarmi a questo prima di codificarlo. – ChandlerPelhams

risposta

7

Basta aggiungere il codice al tuo Form1_Load

DataGridView1.MouseWheel += new MouseEventHandler(DataGridView1_MouseWheel); 

e questo è per l'evento MouseWheel

void DataGridView1_MouseWheel(object sender, MouseEventArgs e) 
{ 
    int currentIndex = this.DataGridView1.FirstDisplayedScrollingRowIndex; 
    int scrollLines = SystemInformation.MouseWheelScrollLines; 

    if (e.Delta > 0) 
    { 
     this.DataGridView1.FirstDisplayedScrollingRowIndex 
      = Math.Max(0, currentIndex - scrollLines); 
    } 
    else if (e.Delta < 0) 
    { 
     this.DataGridView1.FirstDisplayedScrollingRowIndex 
      = currentIndex + scrollLines; 
    } 
} 
+0

a volte ho ottenuto questo System.ArgumentOutOfRangeException – Timeless

1

Lo System.ArgumentOutOfRangeException non si verificherà se:

void DataGridView1_MouseWheel(object sender, MouseEventArgs e) 
{ 
    int currentIndex = this.DataGridView1.FirstDisplayedScrollingRowIndex; 
    int scrollLines = SystemInformation.MouseWheelScrollLines; 

    if (e.Delta > 0) 
    { 
     this.DataGridView1.FirstDisplayedScrollingRowIndex = Math.Max(0, currentIndex - scrollLines); 
    } 
    else if (e.Delta < 0) 
    { 
     if (this.DataGridView1.Rows.Count > (currentIndex + scrollLines)) 
      this.DataGridView1.FirstDisplayedScrollingRowIndex = currentIndex + scrollLines; 
    } 
} 
2

risposta completa È necessario impostare Focus Datagridview

private void DataGridView1_MouseEnter(object sender, EventArgs e) 
     { 
      DataGridView1.Focus(); 
     } 

then Add Mouse wheel event in Load function 
DataGridView1.MouseWheel += new MouseEventHandler(DataGridView1_MouseWheel); 

Finally Create Mouse wheel function 

void DataGridView1_MouseWheel(object sender, MouseEventArgs e) 
{ 
    int currentIndex = this.DataGridView1.FirstDisplayedScrollingRowIndex; 
    int scrollLines = SystemInformation.MouseWheelScrollLines; 

    if (e.Delta > 0) 
    { 
     this.DataGridView1.FirstDisplayedScrollingRowIndex = Math.Max(0, currentIndex - scrollLines); 
    } 
    else if (e.Delta < 0) 
    { 
     if (this.DataGridView1.Rows.Count > (currentIndex + scrollLines)) 
      this.DataGridView1.FirstDisplayedScrollingRowIndex = currentIndex + scrollLines; 
    } 
} 

Funziona bene per me.

Problemi correlati