web-dev-qa-db-fra.com

Comment puis-je faire défiler mon panneau en utilisant ma molette?

J'ai un panneau sur mon formulaire avec AutoScroll défini sur true pour qu'une barre de défilement s'affiche automatiquement.

Comment puis-je faire en sorte qu'un utilisateur puisse utiliser sa molette de souris pour faire défiler le panneau? Merci beaucoup.

37
Sergio Tapia

Le panneau ou une commande du panneau doit avoir le focus. Notez que si le contrôle avec le focus a des barres de défilement, il défilera à la place du panneau.

28
Jon B

Ce qui a fonctionné pour moi a été l'ajout de panel1_MouseEnter EventHandler:

private void panel1_MouseEnter(object sender, EventArgs e)
{
    panel1.Focus();
}
55
beam022

Le code ci-dessous fonctionne pour moi .....

    Public Form
{
InitializeComponent();  
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel);
}

 private void Panel1_MouseWheel(object sender, MouseEventArgs e)
        {
         panel1.Focus();
         }
15
Nivas

Dans le fichier de concepteur, vous pouvez ajouter la ligne de code suivante. l'événement MouseWheel n'est pas ajouté à la liste des événements de la fenêtre Propriétés.

this.Panel1.MouseWheel+= System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel);

Panel1_MouseWheel sera déclenché lorsque vous faites rouler la souris

Ajoutez le code dans le fichier .cs

2
Pavan Navali

Assurez-vous que votre panneau a le focus. Et ceci est un code simple pour faire défiler votre barre de défilement du panneau. J'espère que cette aide. :) entrez le code ici

        if(e.Delta > 0)
        {

            if (pnlContain.VerticalScroll.Value - 2 >= pnlContain.VerticalScroll.Minimum)
                pnlContain.VerticalScroll.Value -= 2;
            else
                pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Minimum;
        }
        else
        {
            if (pnlContain.VerticalScroll.Value + 2 <= pnlContain.VerticalScroll.Minimum)
                pnlContain.VerticalScroll.Value += 2;
            else
                pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Maximum;
        }
2
Nguyen Minh Hien

J'utilise un formulaire Windows avec BorderStyle défini sur aucun, où j'utilise un panneau pour insérer toutes mes commandes, de sorte qu'il a l'air agréable (différence de couleur, etc.) avait le même problème que d'autres formulaires qui fonctionnaient bien.

Qu'est-ce que j'ai oublié:

   public myForm()
   {
        InitializeComponent();
        this.DoubleBuffered = true;
   }

DoubleBuffered est magique, j'ai remarqué ..

1
CularBytes

Le déplacement de la molette doit déclencher l'événement MouseMove du contrôle. L'argument MouseEventArgs a une propriété appelée Delta, qui donne le nombre (signé) d'encoches que la molette de la souris a déplacés. Vous pouvez utiliser cette propriété pour faire défiler le panneau.

0
MusiGenesis

La solution (vue ci-dessus) fournie par Beam022 a fonctionné pour moi alors que beaucoup d'autres solutions ne l'ont pas été. Dans mon cas, j'essayais de faire défiler un contrôle DataGridView avec l'événement mousewheel. 

Le gestionnaire d'événements DataGridView_MouseWheel était appelé mais la valeur FirstDisplayedScrollingRowIndex n'a jamais été modifiée. La valeur était toujours '0' même après l'avoir explicitement définie sur 1. C'est comme si la propriété était en lecture seule. 

Encore une reproduction dans .Net Framework 4.6.

0
GrayDwarf

Dans mon cas, toute la zone cliente du panneau était occupée par UserControls (pas un seul pixel de la zone interne visible, à l'exception des barres de défilement).

Dans ce cas, le panneau n'obtient pas les événements de souris et ne se focalisera jamais (apparemment, cliquer sur la barre de défilement ne compte pas comme "se trouver à l'intérieur du panneau").

J'ai dû ajouter les lignes suivantes au constructeur de ma classe dérivée UserControl:

MouseEnter += delegate {
   Parent?.Focus();
};

Maintenant, cela fonctionne bien, car je n'ai pas de contenu défilable dans les contrôles utilisateur.

0
Xan-Kun Clark-Davis