在表单之间共享重复功能

时间:2017-05-15 07:07:37

标签: c#

这是我的第一个问题。我是一个完全新手(我有一些Arduino和Delphi的知识,但没有关于C#的内容)并且我一直在尝试没有成功。为了优化我收到的一些代码,我发现每个表单上都复制了一些函数,我希望将它们减少到一个(如果在单独的.cs文件中更好),并从不同的表单中访问它。

例如:我在Form1和Form2上有标签,我希望根据每个Form上CheckBox的.Checked属性更改其颜色。很明显cb_colorear在Form1中找到控件。我试图传递它像(String formName)的值,然后尝试formName.Controls.Find,但这不起作用。有小费吗? 我也很想指出有关这些问题的一些文件。我已经尝试了一下,但不知道C#和英语不能流利的英语我很难找到我理解的信息。谢谢大家的帮助。

//Form1 Code    
namespace PruebaAccesoMetodos
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.Show(); ;
        }

        public Color cb_colorear(String cbName, String label)
        {

            Control[] ctrl = Controls.Find(cbName, true);
            CheckBox cb = ctrl[0] as CheckBox;

            Control[] ctrl2 = Controls.Find(label, true);
            Label lbl = ctrl2[0] as Label;

            if (cb.Checked == false)
            {
                return Color.Red;
            }
            else
            {
                return Color.LawnGreen;
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {

               label1.BackColor = cb_colorear(checkBox1.Name, label1.Name);
        }

        private void button3_Click(object sender, EventArgs e)
        {

            System.Diagnostics.Process.Start("explorer.exe", @"c:\");
        }
    }
}

和Form2代码:

namespace PruebaAccesoMetodos
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Form1 frm1instance = new Form1();
            label1.BackColor = frm1instance.cb_colorear(this.checkBox1.Name, this.label1.Name);


        }

    }
}

更新

好的,我做到了。在问哈哈之前应该多尝试一下。

更改了cb_colorear函数以接收表单类型值:

    public Color cb_colorear(String cbName, String label, Form formName)
    {

        Control[] ctrl = formName.Controls.Find(cbName, true);
        CheckBox cb = ctrl[0] as CheckBox;

        Control[] ctrl2 = formName.Controls.Find(label, true);
        Label lbl = ctrl2[0] as Label;

        if (cb.Checked == false)
        {
            return Color.Red;
        }
        else
        {
            return Color.LawnGreen;
        }

    }

然后在调用函数的每个按钮上添加一个:

private void button1_Click(object sender, EventArgs e)
{

       label1.BackColor = cb_colorear(checkBox1.Name, label1.Name, this);
}

但是,虽然它有效,但这是适当的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您可以使用extension method

public static class Extensions
{
    public static void cb_colorear(this Form form, string cbName, string label)
    {
        Control[] ctrl = form.Controls.Find(cbName, true);
        CheckBox cb = ctrl[0] as CheckBox;

        Control[] ctrl2 = form.Controls.Find(label, true);
        Label lbl = ctrl2[0] as Label;

        if (!cb.Checked)
        {
            lbl.BackColor = Color.Red;
        }
        else
        {
            lbl.BackColor = Color.LawnGreen;
        }
    }
}

那我们在这里做了什么:

  1. 我们创建了一个新的静态类(我选择将其称为Extensions作为示例)。
  2. 我们创建扩展方法。这种方法必须是静态的。注意第一个参数(this Form form而不仅仅是Form form)。这个单一的关键字有所不同。这是将我们的常规方法转变为扩展的原因。
  3. 其余部分与您的代码相同。我们使用form和任何其他参数一样。我们无需return Color,因为我们可以直接设置标签的BackColor属性。
  4. 声明扩展方法后,我们可以在任何形式中执行以下操作:

    private void SomeFormMethod()
    {
        this.cb_colorear(checkBox.Name, label.Name)
    }
    

    第一个参数隐式传递给扩展方法,允许我们使用this.method()语法。