【问题标题】:Specify properties from baseform towards inherited ones指定从 baseform 到继承的属性
【发布时间】:2023-04-03 00:33:02
【问题描述】:

我有一个 c# winform,它是我项目中所有表单的模板。

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

现在我尝试了弹出的简单想法:

 foreach (Control c in Controls)
        {

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

我将此代码放在基本表单加载事件中,但没有运气。我尝试将修饰符从继承形式更改为受保护,但没有运气。

这个问题有什么解决办法吗?或者我必须将此代码放在我所有继承 baseForm 的表单中?

【问题讨论】:

    标签: c# .net winforms inheritance custom-controls


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你开始沿着正确的路线思考,但你还没有完全做到。解决这个问题的方法肯定是面向对象的继承,但是一定要注意不要违反 OOP 的其他重要原则,即封装。

      换一种说法,表单不应该被要求“知道”它所包含的控件的属性。它不应该知道或关心它包含 ComboBox 或 TextBox 或 ListView。

      相反,您应该对每个要修改的子控件进行子类化,并在那里设置它们的默认属性。然后,您只需将自定义子类控件的实例添加到表单中,而不是内置控件。

      因此,例如,您的自定义 TextBox 类可能如下所示:

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

      【讨论】:

      • 我想过这个解决方案,但不是一个选择。适合扩展方法的控件有小的变化。不过,我仍在研究这个问题。希望能找到更好的选择。
      • @LordRevan:当然没有更好的选择。我不明白你认为这个选项有什么错误。
      • 对我来说一个错误的选择是因为我已经有一些表单继承了带有一些文本框的基本表单,我想为其添加一个简单的行为,例如:如果我按下向上键或向下键来改变它的焦点。该解决方案要求我更改大量代码。
      • @LordRevan,它可能没有你想象的那么多工作。如果您使用自定义默认颜色(或其他)创建名为 MyTextBox 的自定义 TextBox,则可以在解决方案中使用 MyTextBox 进行全局搜索和替换。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2016-02-15
      • 1970-01-01
      • 2014-02-03
      • 2012-05-08
      • 1970-01-01
      • 2011-06-25
      相关资源
      最近更新 更多