2011-08-19 44 views
2

我有一个c#winform,它是我的项目中所有窗体的模板。指定从baseform到继承的属性

我的问题是我如何设置控件的一些属性,这些属性将被添加到来自baseform的继承窗体中。 例如,我希望表格中的所有文本框都具有特定的颜色,或者调用扩展方法。

现在我想简单的想法冒出来:

foreach (Control c in Controls) 
     { 

      if(c is ComboBox) 
      { 
       //do something 
      } 
      if(c is TextBox) 
      { 
       //do something 
      } 
     } 

我把这个代码的基本形式加载事件,但没有运气。我尝试将修饰符从继承的表单改为受保护的,但没有运气。

有没有解决这个问题的方法?或者我有义务将这些代码放在继承baseForm的所有表单中?

回答

0

自定义控件是解决您所面临问题的手段。只需扩展现有的控件以获得您想要的属性,然后您就可以在所有表​​单中使用这些控件。

0

你开始思考沿着正确的路线,但你还没有到达那里。这个问题的解决方案绝对是面向对象的继承,但是你必须小心不要违反OOP的其他重要原则,即封装。

换一种方式,不应要求表格“了解”它所包含的控件的属性。它不应该知道或关心它包含组合框或文本框或ListView。

相反,您应该为每个要修改的子控件创建子类,并在其中设置其默认属性。然后,您只需将自定义子类控件的实例添加到您的表单中,而不是内置控件。

因此,举例来说,您的自定义TextBox类可能是这样的:

public class CustomTextBox : TextBox // inherit from TextBox 
{ 
    public CustomTextBox() 
    { 
     // default constructor 
    } 

    // other logic... 

} 
+0

我想到这个问题的解决方案,但并不完全一个选项。适用于扩展方法的控件有小的变化。我仍然在研究这个问题。希望找到一个更好的选择。 – LordRevan

+0

@LordRevan:当然没有更好的选择。我不明白你用这个选项认为是错误的*。 –

+0

对我来说一个错误的选择是因为我已经有一些表单继承了一些文本框,我想添加一个简单的行为,例如:如果我按下键或向下键来改变它的焦点。这个解决方案迫使我改变很多代码。 – LordRevan