Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在表单之间共享重复功能_C# - Fatal编程技术网

C# 在表单之间共享重复功能

C# 在表单之间共享重复功能,c#,C#,这是我的第一个问题。我是一个完全的新手(我有一些Arduino和Delphi方面的知识,但在C#方面一无所获),有些东西我一直在尝试,但没有成功。为了优化我收到的一些代码,我在每个表单上发现了一些复制粘贴的函数,我希望将它们减少到一个(如果在单独的.cs文件中更好),并从不同的表单访问它 例如:我在Form1和Form2上有标签,我希望根据每个表单上复选框的.Checked属性更改其颜色。很明显,cb_colorear在Form1中找到了控件。我尝试像(String formName)一样传递它

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

例如:我在Form1和Form2上有标签,我希望根据每个表单上复选框的.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:\");
        }
    }
}
和表格2代码:

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;
        }

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

private void button1_Click(object sender, EventArgs e)
{

       label1.BackColor = cb_colorear(checkBox1.Name, label1.Name, this);
}
但是,当它工作时,这是propper解决方案吗?

您可以使用一个

那么我们在这里做了什么:

  • 我们创建一个新的静态类(例如,我选择将其称为
    Extensions
  • 我们创建扩展方法。此方法必须是静态的。注意第一个参数(
    此表单
    ,而不仅仅是
    表单
    )。这一个关键字使一切不同。这就是将我们的常规方法转变为扩展的原因
  • 其余部分与代码相同。我们使用
    表单
    ,就像使用任何其他参数一样。无需
    返回
    颜色,因为我们可以直接设置标签的
    BackColor
    属性
  • 声明扩展方法后,我们可以以任何形式执行以下操作:


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

    我想你有个错误。它不应该是公共静态无效cb_colorear而不是公共静态颜色吗?这样对我很有效。非常感谢。
    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;
            }
        }
    }
    
    private void SomeFormMethod()
    {
        this.cb_colorear(checkBox.Name, label.Name)
    }