10

在我的应用程序中,我在不同的上下文中运行相同的 winform 来控制按钮的可见性、启用文本字段和 winform 标题文本。我决定这样做的方法是简单地将一个字符串传递给表单构造函数,并使用几个 if 语句检查它,这些语句又包含所需的 winform 调整。

if (formContext == "add")
{
    Text = "Add member";
}
if (formContext == "edit")
{
    Text = "Change role";
    userTextBox.Enabled = false;
    searchButton.Visible = false;
}

这工作正常,但是“文本”关键字得到 ReSharper 添加的蓝色波浪线,并带有以下消息:构造函数中的虚拟成员调用。这是一个潜在的问题,还是只是某种过于热情的 ReSharper 信息。

任何关于改进我的实施的澄清或建议将不胜感激。

4

4 回答 4

9

基类 ctor 中的虚拟成员调用可能会导致一些逻辑在子类的 ctor 被调用之前在子类中运行(因此在对象有机会将自身初始化为一致状态之前)。

这只是一个很好的提醒,因此您知道您正在做的事情可能会导致一些令人讨厌的意外行为。

于 2009-01-19T12:57:21.080 回答
6

除了现有答案之外,您还可以为表单添加 Load 事件处理程序:

Load += delegate
{
    if (formContext == "add")
    {
        Text = "Add member";
    }
    if (formContext == "edit")
    {
        Text = "Change role";
        userTextBox.Enabled = false;
        searchkButton.Visible = false;
    }
};
于 2009-01-19T13:20:37.850 回答
4

封你的课就好了。

于 2009-01-19T15:18:37.003 回答
0

我建议重写你的类如下:

public partial class Form1 : Form
{
    public enum FormContextMode
    {
        Add,
        Edit
    }

    private FormContextMode m_mode = FormContextMode.Add; 

    public Form1( FormContextMode mode )
    {
        InitializeComponent();
        m_mode = mode;
        Load += delegate { UpdateForm(); };
    }

    private void UpdateForm()
    {
        if( m_mode == FormContextMode.Add )
        {
            Text = "Add member";    
        }
        else if( m_mode == FormContextMode.Edit )
        {
            Text = "Change role";
            userTextBox.Enabled = false;
            searchkButton.Visible = false;
        }
    }
}
于 2009-01-19T14:41:45.970 回答