【问题标题】:prevent the designer from calling a getter (VS 2008, WinForms)防止设计师调用吸气剂(VS 2008,WinForms)
【发布时间】:2010-03-18 14:26:49
【问题描述】:

我有一个简单的 UserControl,其中包含一个最初为空的 ComboBox。该 CB 的 setter 向其添加项目,而 getter 返回所选项目。当将此 UC 添加到 Form 时,设计人员会自动为空的 CB 调用 getter。稍后会调用用物品填充 CB 的方法。我可以想出一两种方法通过在代码中“乱来”来绕过这个问题。但在我开始之前,我想问你是否有办法阻止设计者调用 getter 方法。也许具有类似于 Browsable 或 Bindable 的属性? 谢谢

【问题讨论】:

    标签: visual-studio winforms user-controls


    【解决方案1】:

    我不清楚这个吸气剂可能是什么样子。但是,您要确保设计器不会序列化应该只在运行时使用的属性。使用属性执行此操作:

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Browsable(false)]
        public int SomeProperty { 
            //etc... 
        }
    

    【讨论】:

    • 谢谢...这就是我要找的。有用。设计者不再调用 getter 方法。
    【解决方案2】:

    试试这个:

    public ListBoxItem MyProperty
    {
        get
        {
            if (this.DesignMode)
            {
                return new ListBoxItem("empty");
            }
            else
            {
                return comboBox1.SelectedItems[0];
            }
        }
    }
    

    getter 仍会被调用,但您可以控制此处返回的内容。

    或者,我认为将 [Browsable (false)] 属性放在 getter 上方也可能有效,但我不确定。

    【讨论】:

    • 我猜我的代码很糟糕。我有一个事件记录了 CB 的选定索引的更改。所以设计者调用getter,引发事件并且接受所选项目的方法抛出异常(false 类型)。当然,我可以在方法中检查呈现的项目是否属于正确的类型。等等。但是我真的很想知道是否可以简单地向设计师隐藏吸气剂,还是我的这种需求也是一个坏主意?
    • 有时让控件在设计器中正常运行是很困难的,但是在表单上有组合框是很正常的,所以我不确定你为什么会遇到这个问题。一个简单的解决方案是仅在运行时将更改事件附加到组合框。在加载事件中,您可以输入cb.onChange += new EventHandler ... 之类的内容,而不是在设计器中选择该事件并双击它。
    • 感谢您的努力。我可以将这个部分与 this.DesignMode 一起使用。除此之外,你是对的。有很多方法可以绕过这个问题,但我只是好奇……现在我得到了答案。
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2018-04-05
    • 2021-04-02
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多