¿Cómo desactivo un cuadro combinado personalizado sin que aparezca atenuado?

programación


Hola, tengo una clase de cuadro combinado personalizado.
En algunos casos necesito que esté deshabilitado sin que esté atenuado y en otros necesito que esté habilitado con datos cargados de una fuente de datos de la base de datos del servidor SQL a través de una consulta SQL.
Entonces pensé en esto, entrar a mi clase personalizada.
y crear un evento MouseMove personalizado para que pierda el foco cuando quiera desactivarlo. Pero no sé cómo anularlo, porque tengo un argumento adicional de tipo bool para Desactivar.

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

Sin embargo, encontré en otro sitio lo siguiente, está bien, pero no lo entiendo muy bien y también necesito lo contrario para habilitar el
CustomCombo para tener los valores apropiados de fuente de datos de mi base de datos.

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;

     }

En caso de que utilice la propiedad Enabled, está bien, pero no me gusta que aparezca en gris. Y ComboBox no tiene una propiedad ReadOnly como los cuadros de texto.
Cualquier sugerencia y explicación para ambos sentidos, por favor, será muy apreciada. Muchas gracias de antemano.

Lo que he probado:

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

Solución 1

El objetivo es que el ComboBox en realidad no esté deshabilitado, pero el menú desplegable está configurado en 1 para que baje, pero como solo hay 1 píxel no lo verá.

Las otras propiedades de los controladores KeyDown, KeyPress y KeyUp, e.Handled, están configuradas en verdadero, lo que significa que el evento ha sido manejado y no se hace nada más.

Solución 2

Aquí está mi clase 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);
                    }
                }
            }
        }
        
    }
}

コメント

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