C# 指定从baseform到继承的属性

C# 指定从baseform到继承的属性,c#,.net,winforms,inheritance,custom-controls,C#,.net,Winforms,Inheritance,Custom Controls,我有一个c#winform,它是我项目中所有表单的模板 我的问题是如何为将添加到从基表单继承的表单中的控件设置一些属性。 例如,我希望表单中的所有文本框都具有特定的颜色,或者调用扩展方法 现在我尝试了一个突然冒出来的简单想法: foreach (Control c in Controls) { if(c is ComboBox) { //do something }

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

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

现在我尝试了一个突然冒出来的简单想法:

 foreach (Control c in Controls)
        {

            if(c is ComboBox)
            {
                //do something
            }
            if(c is TextBox)
            {
               //do something
            }
        }
我把这段代码放在基本表单加载事件中,但运气不好。我尝试将修改器从继承形式更改为受保护形式,但没有成功


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

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

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

您开始按照正确的思路思考,但您还没有完全做到这一点。这个问题的解决方案无疑是面向对象的继承,但您必须小心不要违反OOP的其他重要原则,即封装

换一种方式来说,表单不需要“知道”它包含的控件的属性。它不应该知道或关心它是否包含组合框、文本框或列表视图

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

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

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

    // other logic...

}

你开始按照正确的思路思考,但你还没有完全做到。这个问题的解决方案无疑是面向对象的继承,但您必须小心不要违反OOP的其他重要原则,即封装

换一种方式来说,表单不需要“知道”它包含的控件的属性。它不应该知道或关心它是否包含组合框、文本框或列表视图

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

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

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

    // other logic...

}

我考虑过这个解决方案,但不是一个很好的选择。控件中有一些小的变化,适合扩展方法。不过我还在研究这个问题。希望找到更好的选择。@LordRevan:当然没有更好的选择了。我不明白你认为这个选项有什么问题。对我来说,一个错误的选项是因为我已经有一些表单继承了baseform,并带有一些文本框,我想为这些文本框添加一个简单的行为,例如:如果我按向上键或向下键来更改它的焦点。这个解决方案迫使我修改了很多代码。@LordRevan,这可能没有你想象的那么多工作。如果您使用自定义默认颜色(或其他任何颜色)创建一个名为MyTextBox的自定义文本框,您可以在解决方案中进行全局搜索,并将TextBox替换为MyTextBox。我考虑过这个解决方案,但这并不是一个很好的选择。控件中有一些小的变化,适合扩展方法。不过我还在研究这个问题。希望找到更好的选择。@LordRevan:当然没有更好的选择了。我不明白你认为这个选项有什么问题。对我来说,一个错误的选项是因为我已经有一些表单继承了baseform,并带有一些文本框,我想为这些文本框添加一个简单的行为,例如:如果我按向上键或向下键来更改它的焦点。这个解决方案迫使我修改了很多代码。@LordRevan,这可能没有你想象的那么多工作。如果使用自定义默认颜色(或其他颜色)创建名为MyTextBox的自定义文本框,则可以在解决方案中进行全局搜索并将TextBox替换为MyTextBox。