只读(但可放置)ComboBox

时间:2011-03-27 18:40:59

标签: .net winforms combobox readonly

我正在构建一个具有正常着色的Windows窗体组合框,并允许显示下拉列表,但不允许值实际更改。据我所知,这不是How to make Combobox in winforms readonly的重复,因为那里的所有建议似乎都是为了禁用组合框的交互性。

我的理由:我有一个表单,其中所有控件都是只读的,并且由于应用程序的性质,我认为当组合框的值没有改变时,用户不会感到困惑。我希望用户能够看到组合框绑定的枚举的所有可能值。

到目前为止我所做的是一个非常糟糕的黑客:

public partial class ReadOnlyComboBox : ComboBox
{
    int prevIndex = -1;

    public ReadOnlyComboBox()
    {
        InitializeComponent();
    }

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (prevIndex <= 0)
            prevIndex = SelectedIndex;
        else
            SelectedIndex = prevIndex;
    }
}

实际上,这会从框架中忽略虚假的“0”值,并获取从绑定源获取的第一个非零值。直接的缺点是该值只能设置一次,并且绑定的枚举必须从1开始。

欢迎任何有关清理此事的建议。感谢。

1 个答案:

答案 0 :(得分:1)

使用DropDownClosed事件

public class ReadOnlyComboBox : ComboBox
{
    bool afterDropDown ;
    int prevIndex;

    public ReadOnlyComboBox()
    {
        this.SelectedIndexChanged+=new EventHandler(ReadOnlyComboBox_SelectedIndexChanged);
        this.DropDownClosed += new EventHandler(ReadOnlyComboBox_DropDownClosed);
    }

    void ReadOnlyComboBox_DropDownClosed(object sender, EventArgs e)
    {
        afterDropDown = true;
    }

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (afterDropDown)
        {
            afterDropDown = false;
            SelectedIndex = prevIndex;
        }
        else
        {
            prevIndex = SelectedIndex;
        }
    }
}