.net - 只读(但可删除)组合框

标签 .net winforms combobox readonly

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

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

到目前为止,我有一个非常糟糕的 hack:

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”值,并获取从绑定(bind)源获取的第一个非零值。直接的缺点是该值只能设置一次,并且绑定(bind)的枚举必须从 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;
        }
    }
}

关于.net - 只读(但可删除)组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5451420/

相关文章:

.net - 无法设置 ComboBox 的 DropDownHeight

vb.net - 子窗体的最大化状态在 MDI 容器中使用时无法正常工作 (Visual Basic 2013)

java - 如何获取 Vaadin8 组合框中的项目大小?

c# - Winform 上的 C# ComboBox 是否有更新前

c# - 我应该如何在 ASP.NET MVC 4 服务提供商中实现 SAMLP 2.0?

javascript - Signalr:JavaScript 客户端无法在 IE 上重新连接(parseerror 异常)

.net - OData v4.0 如何设置MaxExpansionDepth?

c# - 考虑类的多个属性的优雅排序算法

c# - btnClose 设置为 CausesValidation = false 但不起作用

c# - 将组合框字符串值转换为 int