【解決方法】カスタム コンボ ボックスを灰色表示せずに無効にするにはどうすればよいですか?

プログラミングQA


こんにちは、カスタム コンボ ボックス クラスがあります。
グレー表示にせずに無効にする必要がある場合もあれば、SQL クエリを通じて SQL サーバー データベースのデータ ソースのデータをロードして有効にする必要がある場合もあります。
そこで私はカスタムクラス内に入るためにこれを考えました
そして、カスタム MouseMove イベントを作成して、無効にしたいときにフォーカスを緩めることができます。 しかし、ブール型の追加引数 Disable があるため、それをオーバーライドする方法がわかりません。

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

ただし、別のサイトで次のことを見つけました。それは問題ありませんが、よく理解できません。有効にするには、その反対も必要です。
CustomCombo を使用して、データベースのデータソースの適切な値を取得します。

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;

     }

Enabled プロパティを使用する場合は問題ありませんが、グレー表示になるのは好きではありません。 また、ComboBox にはテキストボックスのような ReadOnly プロパティがありません。
両方の方法についての提案と説明をいただければ幸いです。 どうぞよろしくお願いいたします。

私が試したこと:

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

解決策 4

イネーブルメソッドを作成します。 KeyDown、KeyPress、および KeyUp ハンドラーをコメントアウトすると、これらは正常に機能するようになります。

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

解決策 1

オブジェクトは、ComboBox が実際には無効になっていないが、ドロップダウンが 1 に設定されているため、ドロップダウンしますが、1 ピクセルしかないため表示されません。

他の KeyDown、KeyPress、および KeyUp ハンドラーの e.Handled プロパティは、イベントが処理され、それ以上何も行われないことを意味する true に設定されます。

解決策 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);
                    }
                }
            }
        }
        
    }
}

解決策 3

DropDownHeight を 1 に設定してコンボ ボックスを無効にし、再度有効にする必要がある場合、値をデータセットの内容にリセットするにはどうすればよいでしょうか? 1 つの値を保持するためです。 これをどのように変更すればよいでしょうか。また、要素の数やフォントに応じて DropDownHeight を計算するにはどうすればよいでしょうか?

コメント

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