كيف يمكنني تعطيل مربع تحرير وسرد مخصص دون أن يصبح باللون الرمادي؟


مرحبًا، لدي فئة مربع تحرير وسرد مخصص.
في بعض الحالات، أحتاج إلى تعطيله دون أن يصبح باللون الرمادي، وفي حالات أخرى أحتاج إلى تمكينه بالبيانات المحملة لمصدر بيانات قاعدة بيانات خادم SQL من خلال استعلام SQL.
لذلك فكرت في هذا، للذهاب إلى صفي المخصص
وقم بإنشاء حدث MouseMove مخصص لجعله يفقد التركيز عندما أرغب في تعطيله. لكنني لا أعرف كيفية تجاوزه، لأن لدي وسيطة إضافية من النوع المنطقي تعطيل.

ج #
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;

     }

في حالة استخدام الخاصية “ممكّن”، فلا بأس، لكني لا أحب أن أكون باللون الرمادي. ولا يحتوي ComboBox على خاصية للقراءة فقط مثل مربعات النص.
أي اقتراح وشرح لكلا الاتجاهين من فضلك، سيكون موضع تقدير كبير. شكرا جزيلا لكم في المقدمة.

ما حاولت:

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

الهدف هو أن ComboBox لم يتم تعطيله فعليًا ولكن تم تعيين القائمة المنسدلة على 1 بحيث تنخفض ولكن بما أن 1 بكسل فقط لن تراها.

يتم تعيين خصائص معالجات KeyDown وKeyPress وKeyUp الأخرى e.Handled على القيمة الحقيقية مما يعني أنه تمت معالجة الحدث ولم يتم إجراء أي شيء آخر.

الحل 2

هذه هي فئة 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をコピーしました