2009-05-26 3 views
0

J'ai remarqué que l'événement Click ou tout autre comportement de contrôle n'est pas toujours déclenché lorsqu'un contrôle contenu dans un ScrollableControl (Panel, etc.) est cliqué.Contrôles Windows Forms dans un ScrollableControl et des événements

Si le contrôle sur lequel vous avez cliqué n'a pas le focus et n'est que partiellement visible, il défile dans la vue. C'est ce à quoi je m'attends, cependant l'événement Click ne se déclenche pas ou aucun autre comportement de contrôle ne se produit.

Si le contrôle a déjà le focus et n'est que partiellement visible, les événements sont déclenchés. Case à cocher - Fait défiler l'affichage, l'état vérifié ne change pas. CheckedListBox - Fait défiler l'affichage, l'élément cliqué n'est pas sélectionné. TreeView - Défile dans la vue, le nœud cliqué n'est pas sélectionné. Bouton - Défile dans la vue, l'événement de clic ne se lève pas.

Pour reproduire cela, vous pouvez effectuer les opérations suivantes:

  1. Ajouter l'un des contrôles ci-dessus à un panneau
  2. Ajouter un gestionnaire d'événements pour Click, SelectedItemChanged, etc
  3. Redimensionner le formulaire afin que barres de défilement sont visibles sur le panneau
  4. Faites défiler le panneau pour que l'une des commandes soit partiellement visible
  5. Cliquez sur le contrôle partiellement visible

Y a-t-il un moyen de s'assurer que les événements se déclenchent?

Répondre

0

David,

Cela a fonctionné pour moi.

code dans Form1.Designer.cs:

namespace WindowsFormsApplication1 
{ 
    partial class Form1 
    { 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.panel1 = new System.Windows.Forms.Panel(); 
      this.textBox2 = new System.Windows.Forms.TextBox(); 
      this.textBox1 = new System.Windows.Forms.TextBox(); 
      this.panel1.SuspendLayout(); 
      this.SuspendLayout(); 
      // 
      // panel1 
      // 
      this.panel1.AutoScroll = true; 
      this.panel1.Controls.Add(this.textBox2); 
      this.panel1.Controls.Add(this.textBox1); 
      this.panel1.Location = new System.Drawing.Point(86, 75); 
      this.panel1.Name = "panel1"; 
      this.panel1.Size = new System.Drawing.Size(176, 70); 
      this.panel1.TabIndex = 0; 
      // 
      // textBox2 
      // 
      this.textBox2.Location = new System.Drawing.Point(109, 17); 
      this.textBox2.Name = "textBox2"; 
      this.textBox2.Size = new System.Drawing.Size(100, 20); 
      this.textBox2.TabIndex = 1; 
      this.textBox2.Click += new System.EventHandler(this.textBox2_Click); 
      // 
      // textBox1 
      // 
      this.textBox1.Location = new System.Drawing.Point(3, 17); 
      this.textBox1.Name = "textBox1"; 
      this.textBox1.Size = new System.Drawing.Size(100, 20); 
      this.textBox1.TabIndex = 0; 
      this.textBox1.Click += new System.EventHandler(this.textBox1_Click); 
      // 
      // Form1 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(493, 271); 
      this.Controls.Add(this.panel1); 
      this.Name = "Form1"; 
      this.Text = "Form1"; 
      this.panel1.ResumeLayout(false); 
      this.panel1.PerformLayout(); 
      this.ResumeLayout(false); 

     } 

     #endregion 

     private System.Windows.Forms.Panel panel1; 
     private System.Windows.Forms.TextBox textBox2; 
     private System.Windows.Forms.TextBox textBox1; 
    } 
} 

code dans Form1.cs:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void textBox1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Click1"); 
     } 

     private void textBox2_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Click2"); 
     } 
    } 
}