2008-12-16 4 views

Répondre

6

Pourquoi avez-vous besoin d'appeler une fonction lorsque la liste défile?

Si vous modifiez les éléments comme il est défilé, je vous recommande de définir la listview à virtuel.

Ou vous pouvez remplacer le listview et faire:

public class TestListView : System.Windows.Forms.ListView 
{ 
    private const int WM_HSCROLL = 0x114; 
    private const int WM_VSCROLL = 0x115; 
    public event EventHandler Scroll; 

    protected void OnScroll() 
    { 

     if (this.Scroll != null) 
      this.Scroll(this, EventArgs.Empty); 

    } 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL) 
      this.OnScroll(); 
    } 
} 
0

est ici une solution qui respecte chacun des modes d'affichage de ListView:

Nous comptons sur le fait que la ListView défile, changer la position des éléments. Si nous vérifions une modification de la propriété Bounds de la première propriété de ListViewItem, nous pouvons savoir si un mouvement s'est produit.

Vous aurez besoin d'ajouter un contrôle Timer à la même forme votre ListView est activé, et sa propriété Enabled-True (cela signifie qu'il se déclenche régulièrement sans avoir à être Start ed). Ajoutez également une variable privée à votre classe de formulaire pour enregistrer le Bounds du premier élément.

private Rectangle _firstItemBounds = null; 

Lorsque vous remplissez votre ListView, définissez cette variable Bounds de premier élément. Par exemple:

private void Form1_Load(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 1000; i++) 
    { 
     listView1.Items.Add(new ListViewItem("Item " + i)); 
    } 

    _firstItemBounds = listView1.Items[0].Bounds; 
} 

Puis ajouter un gestionnaire pour l'événement de TickTimer:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    if (listView1.Items[0] == null) 
    { 
     return; 
    } 

    Rectangle bounds = listView1.Items[0].Bounds; 

    if (bounds != _firstItemBounds) 
    { 
     _firstItemBounds = bounds; 

     // Any scroll logic here 
     // ... 
    } 
} 

La valeur par défaut Timer Interval de 100ms semble fonctionner très bien pour moi, mais vous devrez peut-être modifier ce en fonction ton application.

J'espère que cela aide.

4

il semble que la meilleure approche est la solution du brian. Cependant, il ne répond qu'aux événements générés par les barres de défilement, mais non aux événements du midbutton de la souris.

si vous changez le conditionnel:

if (m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL) 
      this.OnScroll(); 

par:

if (m.Msg == 0x000c2c9) 
      this.OnScroll(); 

maintenant respods à tous les événements de défilement dans listview.

Questions connexes