Bagaimana cara menonaktifkan kotak kombo khusus tanpa menjadi abu-abu?

pemrograman


Halo, saya memiliki kelas kotak kombo khusus.
Dalam beberapa kasus saya memerlukannya untuk dinonaktifkan tanpa menjadi abu-abu dan dalam beberapa kasus lainnya saya memerlukannya untuk diaktifkan dengan data yang dimuat dari sumber data database server sql melalui kueri sql.
Jadi saya memikirkan hal ini, untuk masuk ke dalam kelas khusus saya
dan membuat acara MouseMove khusus untuk membuatnya kehilangan fokus ketika saya ingin menonaktifkannya. Tapi saya tidak tahu bagaimana cara menimpanya, karena saya punya argumen tambahan bool ketik Disable.

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

Namun saya menemukan yang berikut ini di situs lain, tidak apa-apa, tetapi saya tidak memahaminya dengan baik dan saya memerlukan situs yang berlawanan juga, untuk mengaktifkan
CustomCombo agar memiliki nilai sumber data yang sesuai dengan database saya.

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;

     }

Jika saya menggunakan properti Enabled tidak apa-apa, tapi saya tidak ingin berwarna abu-abu. Dan ComboBox tidak memiliki properti ReadOnly seperti kotak teks.
Mohon saran dan penjelasan apa pun untuk kedua cara tersebut, akan sangat dihargai. Terima kasih banyak sebelumnya.

Apa yang saya coba:

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

Solusi 4

Buat metode pengaktifan. Dengan mengomentari penangan KeyDown, KeyPress dan KeyUp, mereka akan berfungsi normal!

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

Solusi 1

Intinya ComboBox sebenarnya tidak dinonaktifkan tetapi dropdownnya disetel ke 1 sehingga turun ke bawah tetapi karena hanya 1 piksel Anda tidak akan melihatnya.

Properti e.Handled penangan KeyDown, KeyPress, dan KeyUp lainnya disetel ke arti sebenarnya bahwa acara telah ditangani dan tidak ada lagi yang dilakukan.

Solusi 2

Ini kelas customCombo saya

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

Solusi 3

Saat kita menonaktifkan kotak kombo dengan menyetel DropDownHeight ke 1 dan kita perlu mengaktifkannya kembali, bagaimana cara menyetel ulang nilai ke konten kumpulan datanya? Karena itu menyimpan 1 nilai. Bagaimana kita mengubahnya, dan bagaimana kita menghitung DropDownHeight bergantung pada jumlah elemen dan mungkin bergantung pada font?

コメント

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