【问题标题】:Read-only (but droppable) ComboBox只读(但可删除)组合框
【发布时间】:2011-07-24 00:17:30
【问题描述】:

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

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

到目前为止,我有一个非常糟糕的 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”值,并获取从绑定源获取的第一个非零值。直接的缺点是该值只能设置一次,并且绑定的枚举必须从 1 开始。

欢迎提供有关清理此问题的任何建议。谢谢。

【问题讨论】:

  • 明确地说,“DropDownStyle”属性设置为“DropDownList”的普通组合框不是您想要的,对吗?
  • 其实我还想要 DropDownList 除了上面的。
  • 好的,所以 DropDownList 显示了不可编辑的项目。为了防止更改,它最初是如何填充的......来自另一个进程,例如更新状态/正在进行的工作?或者,您是否希望用户能够在第一次创建记录时进行编辑,并防止用户在设置初始创建值后进行更改。
  • 用户永远不能编辑数据。该列表由 BindingSource 填充。

标签: .net winforms combobox readonly


【解决方案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;
        }
    }
}

【讨论】:

  • 这类似于我现有的解决方案,但缺点是列表只能填充一次。理想情况下,我希望能够根据需要通过绑定多次更改它,但防止用户编辑。
  • 仍然是一个非常丑陋的黑客,但总比没有好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多