Comment désactiver une combo personnalisée sans être grisée ?

la programmation


Bonjour, j’ai une classe de combo personnalisée.
Dans certains cas, j’ai besoin qu’il soit désactivé sans être grisé et dans d’autres, j’ai besoin qu’il soit activé avec les données chargées d’une source de données de la base de données du serveur SQL via une requête SQL.
Alors j’ai pensé à ça, pour entrer dans ma classe personnalisée
et créez un événement MouseMove personnalisé afin de lui faire perdre le focus lorsque je souhaite le désactiver. Mais je ne sais pas comment le remplacer, car j’ai un argument supplémentaire de type booléen Disable.

C#
private void CustomCbo_MouseMove(object sender, MouseEventArgs e, bool Disable)
{
     if (Disable)
     {
         this.Parent.Focus();
         this.SelectionLength = 0;
     }
}

Cependant j’ai trouvé sur un autre site ce qui suit, c’est ok, mais je ne comprends pas très bien et j’ai besoin du contraire aussi, afin d’activer le
CustomCombo afin d’avoir les valeurs appropriées de source de données de ma base de données.

C#
public void DisableComboWithoutGrayedOut()
    {
          //Appearence Enable, behavior Disabled
          this.DropDownHeight = 1;
          this.KeyDown += (s, e) => e.Handled = true;
          this.KeyPress += (s, e) => e.Handled = true;
          this.KeyUp += (s, e) => e.Handled = true;

     }

Si j’utilise la propriété Enabled, ça va, mais je n’aime pas être grisé. Et ComboBox n’a pas de propriété ReadOnly comme les zones de texte.
Toute suggestion et explication dans les deux sens, s’il vous plaît, sera très appréciée. Merci beaucoup d’avance.

Ce que j’ai essayé :

private void CustomCbo_MouseMove(object sender, MouseEventArgs e, bool Disable)
 {
      if (Disable)
      {
          this.Parent.Focus();
          this.SelectionLength = 0;
      }
 }

  public void DisableComboWithoutGrayedOut()
      {
            //Appearence Enable, behavior Disabled
            this.DropDownHeight = 1;
            this.KeyDown += (s, e) => e.Handled = true;
            this.KeyPress += (s, e) => e.Handled = true;
            this.KeyUp += (s, e) => e.Handled = true;
           
       }

Solution 4

Créez une méthode d’activation. En commentant les gestionnaires KeyDown, KeyPress et KeyUp, ils fonctionneront normalement !

C#
public void EnableComboWithoutGrayedOut()
      {
            //Appearence Enable, behavior Enabled
            this.DropDownHeight = ??;  // Whatever it was before or what you want it to be
            //this.KeyDown += (s, e) => e.Handled = true;
            //this.KeyPress += (s, e) => e.Handled = true;
            //this.KeyUp += (s, e) => e.Handled = true;
           
       }

Solution 1

Le but est que la ComboBox n’est pas réellement désactivée mais la liste déroulante est définie sur 1 afin qu’elle descende, mais comme seulement 1 pixel vous ne la verrez pas.

Les autres propriétés e.Handled des gestionnaires KeyDown, KeyPress et KeyUp sont définies sur true, ce qui signifie que l’événement a été géré et que rien d’autre n’est fait.

Solution 2

Voici ma classe customCombo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
namespace AngelTechShop
{
    public class CustomCombo : ComboBox
    {
        public CustomCombo()
        {
            BorderColor = Color.DimGray;
        }

        [Browsable(true)]
        [Category("Appearance")]
        [DefaultValue(typeof(Color), "DimGray")]
        public Color BorderColor { get; set; }

        private const int WM_PAINT = 0xF;
        private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;

        private bool mDisable;

        public bool Disable
        {
            get { return mDisable; }
            set { mDisable = value; }
        }
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == WM_PAINT)
            {
                using (var g = Graphics.FromHwnd(Handle))
                {
                    // Uncomment this if you don't want the "highlight border".

                    using (var p = new Pen(this.BorderColor, 1))
                    {
                        g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
                    }
                    using (var p = new Pen(this.BorderColor, 2))
                    {
                        g.DrawRectangle(p, 0, 0, Width, Height);
                    }
                }
            }
        }
        
    }
}

Solution 3

Lorsque nous désactivons la zone de liste déroulante en définissant DropDownHeight sur 1 et que nous devons la réactiver, comment pouvons-nous réinitialiser la valeur au contenu de son ensemble de données ? Parce qu’il garde 1 valeur. Comment pouvons-nous changer cela et comment pouvons-nous calculer le DropDownHeight en fonction du nombre d’éléments et en fonction de la police peut-être ?

コメント

タイトルとURLをコピーしました