方法/功能每个控件更新多个属性

时间:2017-01-30 16:48:49

标签: c# controls

我可能是Google搜索或搜索错误的任务(或者不可能)。有没有办法传递控件,如文本框和更改多个属性。例如,将myTextOne传递给方法并将其设置为多行,红色文本等

我尝试对文本框使用类方法,我可以在其中调用一个可以同时操作多个属性的方法,然后在文本框中调用该方法:

        private TextBox pText;
        public TextBox PText
        {
            get { return pText; }
            set { pText= value; }
        }

        public static UpdateProperties()
        {
            pText.Multiline= true;
            pText.BackColor = Color.White;
            //3RD property
        }

/// Calling it:
myTextOne = MyClass.UpdateProperties()

一般情况下,逐行更改属性,但如果有重复的可能性,只需一个方法或其他函数来更新多个属性就会节省更多时间,特别是如果可能< / em>用于其他人。

感谢。

1 个答案:

答案 0 :(得分:2)

只需传递控件

是;你只需要提供适当类型的参数。例如:

static void UpdateProperties(System.Windows.Forms.Controls.TextBox textbox)
{
    textBox.BackColor = Color.White;
    textBox.MultiLine = true;
}

然后,在你的主程序中

MyClass.UpdateProperties(PText);

或将控件作为祖先类型传递

您还可以将参数定义为Control,它允许您传递任何控件,而不仅仅是文本框。但是,该函数只能设置所有控件中常见的属性(例如Text)。

static void UpdateText(System.Windows.Forms.Controls.Control control)
{
    control.Text = "Test";
}

//Main program
MyClass.UpdateText(PControl);

使用扩展方法

您还可以使用extension method语法,如下所示:

namespace MyExtensionMethodNamespace
{
    public class MyExtensionMethodClass
    {
        static public void UpdateProperties(this System.Windows.Forms.Controls.TextBox textbox)
        {
            textBox.BackColor = Color.White;
            textBox.MultiLine = true;
        }

        static public void UpdateText(this System.Windows.Forms.Controls.Control control)
        {
            control.Text = "Test";
        }
    }
}

//Main program
using MyExtensionMethodNamespace;

this.PTextBox.UpdateProperties();
this.PTextBox.UpdateText();

使用流畅的语法

如果您编写扩展方法以便它返回this,您可以使用流畅的语法,如下所示:

namespace MyExtensionMethodNamespace
{
    public class MyExtensionMethodClass
    {
        static public TextBox UpdateProperties(this TextBox textbox)
        {
            textBox.BackColor = Color.White;
            textBox.MultiLine = true;
            return textBox;
        }

        static public Control UpdateText(this Control control)
        {
            control.Text = "Test";
            return control;
        }
    }
}

//Main program
using MyExtensionMethodNamespace;

this.PTextBox.UpdateProperties().UpdateText();

此解决方案很不错,因为您可以在一行中完成所有更新。

一次使用多个控件

一旦弄清楚如何执行上述操作,您可以将其修改为一次使用多个控件,如下所示:

namespace MyExtensionMethodNamespace
{
    public class MyExtensionMethodClass
    {
        static public IEnumerable<TextBox> UpdateProperties(this IEnumerable<TextBox> textboxes)
        {
            foreach( var textBox in textBoxes)
            {
                textBox.BackColor = Color.White;
                textBox.MultiLine = true;
            }
            return textBoxes;
        }

        static public IEnumerable<Control> UpdateText(this IEnumerable<Control> controls)
        {
            foreach ( var control in controls)
            {
                control.Text = "Test";
            }
            return controls;
        }
    }
}

//Main program
using MyExtensionMethodNamespace;

//Update three specific controls
new [] {myControl1, myControl2, myControl3}.UpdateProperties().UpdateText();    

//Update all controls on the form
this.Controls.UpdateProperties().UpdateText();

//Update all TextBox controls on the form
this.Controls.OfType<TextBox>.UpdateProperties().UpdateText();

如果您经常发现自己一次更新多个控件,这会很有帮助。

使用LINQ

当然,您总是可以使用LINQ并传递委托。

using System.Linq;

//Set three specific controls
new[]{myControl1, myControl2, myControl2}.ToList().ForEach(a => {a.Text = "Test";  a.BackColor = Color.Red; a.MultiLine = true});

//Set all controls
this.Controls.ToList().ForEach(a => {a.Text = "Test";  a.BackColor = Color.Red; a.MultiLine = true});

//Set all TextBox controls
this.Controls.OfType<TextBox>.ToList().ForEach(a => {a.Text = "Test";  a.BackColor = Color.Red; a.MultiLine = true});

这个解决方案很不错,因为你根本不需要编写任何辅助函数。