[ad_1]
こんにちは、カスタム コンボ ボックス クラスがあります。
グレー表示にせずに無効にする必要がある場合もあれば、SQL クエリを通じて SQL サーバー データベースのデータ ソースのデータをロードして有効にする必要がある場合もあります。
そこで私はカスタムクラス内に入るためにこれを考えました
そして、カスタム MouseMove イベントを作成して、無効にしたいときにフォーカスを緩めることができます。 しかし、ブール型の追加引数 Disable があるため、それをオーバーライドする方法がわかりません。
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; }
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 ハンドラーをコメントアウトすると、これらは正常に機能するようになります。
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 を計算するにはどうすればよいでしょうか?
[ad_2]
コメント