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 apparaisse automatiquement.

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

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 au lieu du panneau.

Ce qui a fonctionné pour moi, c’est d’append panel1_MouseEnter :

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

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

Dans le fichier de concepteur, vous pouvez append 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

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

J’utilise un formulaire Windows avec BorderStyle défini sur aucun, où j’utilise un panneau pour intégrer toutes mes commandes, de sorte qu’il a l’air sympa (différence de couleur et autres ..) présentait le même problème, alors que d’autres formulaires fonctionnaient bien.

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

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

DoubleBuffered est magique, j’ai remarqué ..

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

La solution (vue ci-dessus) fournie par Beam022 a fonctionné pour moi, contrairement à de nombreuses autres solutions. Dans mon cas, j’essayais de faire défiler un contrôle DataGridView avec l’événement mousewheel.

Le gestionnaire d’événement 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.

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û append 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.