0

を無効にしたいのですcomboboxが、同時に、利用可能な他のオプションをユーザーに表示させたい(つまり、を有効にしたいdropdown)。

デフォルトでは、の場合ComboBox.Enabled = falsedropdownも無効になります(をクリックしても何も起こりませんcombobox)。

私の最初の考えは、それを有効のままにして、を処理ComboBox.SelectedIndex eventしてデフォルト値に戻すことです(何らかの方法でグレー表示する必要があります)。

私が欠けているこのようなネイティブ機能があるかどうか、またはそれを行う他の方法があるかどうか疑問に思っています。

4

4 に答える 4

4

コンボボックス機能が必要ない場合は、コンボボックスを使用しないでください。代わりに ListView を使用してください。

于 2013-02-28T15:00:44.237 に答える
1

「あなたが見るものはあなたが得ることができないものです」コンボボックスは悪い考えのようです。代わりにListBoxを使用することをお勧めします。

于 2013-02-28T15:03:11.290 に答える
0

これはハックな回避策ですが、リクエストに似たものを達成するはずです:

public partial class Form1 : Form
{
    ComboBox _dummy;

    public Form1()
    {
        InitializeComponent();

        // set the style
        comboBox1.DropDownStyle = 
            System.Windows.Forms.ComboBoxStyle.DropDownList;
        // disable the combobox
        comboBox1.Enabled = false;

        // add the dummy combobox
        _dummy = new ComboBox();
        _dummy.Visible = false;
        _dummy.Enabled = true;
        _dummy.DropDownStyle = ComboBoxStyle.DropDownList;
        this.Controls.Add(_dummy);

        // add the event handler
        MouseMove += Form1_MouseMove;
    }

    void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        var child = this.GetChildAtPoint(e.Location);
        if (child == comboBox1)
        {
            if (!comboBox1.Enabled)
            {
                // copy the items
                _dummy.Items.Clear();
                object[] items = new object[comboBox1.Items.Count];
                comboBox1.Items.CopyTo(items, 0);
                _dummy.Items.AddRange(items);

                // set the size and position
                _dummy.Left = comboBox1.Left;
                _dummy.Top = comboBox1.Top;
                _dummy.Height = comboBox1.Height;
                _dummy.Width = comboBox1.Width;

                // switch visibility
                comboBox1.Visible = !(_dummy.Visible = true);
            }
        }
        else if (child != _dummy)
        {
            // switch visibility
            comboBox1.Visible = !(_dummy.Visible = false);
        }
    }
}
于 2013-02-28T15:51:05.990 に答える
0

ListBox提案された他の回答としてa を使用するのが便利でない場合。カスタムコンボボックスを作成してReadOnlyプロパティを追加する方法があります。このコードを試してください:

class MyCombo : System.Windows.Forms.ComboBox
{
    public bool ReadOnly { get; set; }
    public int currentIndex;

    public MyCombo()
    {
        currentIndex = SelectedIndex ;
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        if (ReadOnly && Focused)
            SelectedIndex = currentIndex;

        currentIndex = SelectedIndex;

        base.OnSelectedIndexChanged(e);
    }

}

通常、読み取り専用コントロールの背景色は変更されるべきではないため、その部分は行っていません。

于 2013-02-28T15:55:56.073 に答える