मैं कस्टम कॉम्बो बॉक्स को ग्रे किए बिना कैसे अक्षम कर सकता हूं?


नमस्ते, मेरे पास एक कस्टम कॉम्बो बॉक्स क्लास है।
कुछ मामलों में मुझे इसे ग्रे किए बिना अक्षम करने की आवश्यकता है और कुछ अन्य में मुझे इसे एसक्यूएल क्वेरी के माध्यम से एसक्यूएल सर्वर डेटाबेस के डेटा स्रोत के लोड किए गए डेटा के साथ सक्षम करने की आवश्यकता है।
इसलिए मैंने इस बारे में सोचा, अपनी कस्टम क्लास के अंदर जाऊं
और जब मैं इसे अक्षम करना चाहता हूं तो इसका फोकस ढीला करने के लिए एक कस्टम माउसमूव ईवेंट बनाएं। लेकिन मुझे नहीं पता कि इसे कैसे ओवरराइड किया जाए, क्योंकि मेरे पास बूल टाइप डिसेबल का एक अतिरिक्त तर्क है।

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

हालाँकि मुझे किसी अन्य साइट पर निम्नलिखित मिला, यह ठीक है, लेकिन मैं इसे बहुत अच्छी तरह से नहीं समझता और इसे सक्षम करने के लिए मुझे इसके विपरीत की भी आवश्यकता है
CustomCombo ताकि मेरे डेटाबेस के डेटास्रोत के उचित मान प्राप्त हो सकें।

सी#
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;

     }

यदि मैं सक्षम संपत्ति का उपयोग करता हूं तो यह ठीक है, लेकिन मुझे धूसर होना पसंद नहीं है। और कॉम्बोबॉक्स में टेक्स्टबॉक्स की तरह केवल पढ़ने योग्य संपत्ति नहीं है।
कृपया दोनों तरीकों के लिए कोई सुझाव और स्पष्टीकरण की बहुत सराहना की जाएगी। एडवांस में आपका बहुत बहुत धन्यवाद.

मैंने क्या प्रयास किया है:

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

समाधान 1

वस्तु यह है कि कॉम्बोबॉक्स वास्तव में अक्षम नहीं है लेकिन ड्रॉपडाउन को 1 पर सेट किया गया है ताकि यह नीचे गिर जाए लेकिन केवल 1 पिक्सेल होने के कारण आप इसे नहीं देख पाएंगे।

अन्य KeyDown, KeyPress और KeyUp हैंडलर e.Handled गुण सही अर्थ पर सेट हैं कि ईवेंट को प्रबंधित किया गया है और इससे अधिक कुछ नहीं किया गया है।

समाधान 2

यहाँ मेरी कस्टमकॉम्बो क्लास है

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

समाधान 3

जब हम ड्रॉपडाउनहाइट को 1 पर सेट करके कॉम्बो बॉक्स को अक्षम करते हैं और हमें इसे पुनः सक्षम करने की आवश्यकता होती है तो हम इसकी डेटासेट सामग्री का मान कैसे रीसेट करते हैं? क्योंकि यह 1 मान रखता है। हम इसे कैसे बदल सकते हैं, और हम तत्वों की गिनती और फ़ॉन्ट के आधार पर ड्रॉपडाउनहाइट की गणना कैसे कर सकते हैं?

समाधान 4

एक सक्षम विधि बनाएँ. KeyDown, KeyPress और KeyUp हैंडलर्स पर टिप्पणी करने से वे सामान्य रूप से कार्य करेंगे!

सी#
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;
           
       }

コメント

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