Làm cách nào để tắt hộp tổ hợp tùy chỉnh mà không bị chuyển sang màu xám?

lập trình


Xin chào, tôi có một lớp hộp tổ hợp tùy chỉnh.
Trong một số trường hợp, tôi cần tắt nó mà không bị chuyển sang màu xám và trong một số trường hợp khác, tôi cần bật nó với dữ liệu đã tải của nguồn dữ liệu của cơ sở dữ liệu máy chủ sql thông qua truy vấn sql.
Vì vậy, tôi đã nghĩ về điều này, để vào bên trong lớp tùy chỉnh của mình
và tạo sự kiện MouseMove tùy chỉnh để làm mất tiêu điểm khi tôi muốn tắt nó. Nhưng tôi không biết cách ghi đè nó, vì tôi có một đối số bổ sung thuộc loại bool là Tắt.

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

Tuy nhiên, tôi đã tìm thấy trên một trang web khác như sau, không sao, nhưng tôi không hiểu rõ lắm và tôi cũng cần điều ngược lại để kích hoạt
CustomCombo để có các giá trị nguồn dữ liệu phù hợp cho cơ sở dữ liệu của tôi.

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;

     }

Trong trường hợp tôi sử dụng thuộc tính Enabled thì không sao, nhưng tôi không muốn bị chuyển sang màu xám. Và ComboBox không có thuộc tính ReadOnly như hộp văn bản.
Mọi gợi ý và giải thích cho cả hai cách đều sẽ được đánh giá cao. Cảm ơn bạn rất nhiều trong nâng cao.

Những gì tôi đã thử:

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

Giải pháp 4

Tạo một phương thức kích hoạt. Bằng cách nhận xét các trình xử lý KeyDown, KeyPress và KeyUp, chúng sẽ hoạt động bình thường!

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

Giải pháp 1

Đối tượng là ComboBox không thực sự bị vô hiệu hóa nhưng danh sách thả xuống được đặt thành 1 để nó giảm xuống nhưng vì chỉ có 1 pixel nên bạn sẽ không nhìn thấy nó.

Các thuộc tính e.Handled của trình xử lý KeyDown, KeyPress và KeyUp khác được đặt thành true nghĩa là sự kiện đã được xử lý và không cần làm gì thêm.

Giải pháp 2

Đây là lớp customCombo của tôi

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

Giải pháp 3

Khi chúng tôi tắt hộp tổ hợp bằng cách đặt DropDownHeight thành 1 và chúng tôi cần kích hoạt lại nó, làm cách nào để đặt lại giá trị cho nội dung tập dữ liệu của nó? Bởi vì nó giữ 1 giá trị. Làm cách nào để thay đổi điều đó và làm cách nào chúng tôi có thể tính toán DropDownHeight tùy thuộc vào số lượng phần tử và có thể tùy thuộc vào phông chữ?

コメント

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