2009-01-19 72 views
8

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

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

这工作得很好,但是在“文本”关键字得到一个蓝色squigly线由ReSharper的添加了以下消息:在构造函数中Viritual成员通话。 这是一个潜在的问题,或者是某种过度热情的ReSharper消息。

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

回答

9

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

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

+0

是的...这是我自己认为的路线。任何关于如何更好地做到这一点的建议。稳定性是这个项目的首要任务,我宁愿避免可能的意外行为。 – Sakkle 2009-01-19 13:02:07

+0

你的意思是除了在基类ctor中不调用虚拟方法之外的建议? :-) 在这种情况下,您可以使用数据绑定将表单的Text属性绑定到GUI模型类中的字符串字段,然后该字段包含决定标题栏应该说什么的必要逻辑。 – mookid8000 2009-01-19 13:10:56

+0

是的......我可能可以,但我不知道从哪里开始,我想我必须对按钮和文本字段做同样的操作。 – Sakkle 2009-01-19 13:48:35

6

除了现有的答案,表单,您可以添加一个Load事件处理程序:

Load += delegate 
{ 
    if (formContext == "add") 
    { 
     Text = "Add member"; 
    } 
    if (formContext == "edit") 
    { 
     Text = "Change role"; 
     userTextBox.Enabled = false; 
     searchkButton.Visible = false; 
    } 
}; 
+0

这似乎是我想要完成的最简单和最好的解决方案,无需我重写大量代码。是的...我很懒:P – Sakkle 2009-01-19 13:46:14

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; 
     } 
    } 
} 
3

就封你的类。

相关问题