C# 在表单之间共享重复功能
这是我的第一个问题。我是一个完全的新手(我有一些Arduino和Delphi方面的知识,但在C#方面一无所获),有些东西我一直在尝试,但没有成功。为了优化我收到的一些代码,我在每个表单上发现了一些复制粘贴的函数,我希望将它们减少到一个(如果在单独的.cs文件中更好),并从不同的表单访问它 例如:我在Form1和Form2上有标签,我希望根据每个表单上复选框的.Checked属性更改其颜色。很明显,cb_colorear在Form1中找到了控件。我尝试像(String formName)一样传递它的值,然后尝试formName.Controls.Find,但没有成功。有什么建议吗? 我也希望能看到一些关于这些问题的文件。我试过搜索一下,但不懂C#和英语,英语不流利,我很难找到我理解的信息。谢谢大家的帮助C# 在表单之间共享重复功能,c#,C#,这是我的第一个问题。我是一个完全的新手(我有一些Arduino和Delphi方面的知识,但在C#方面一无所获),有些东西我一直在尝试,但没有成功。为了优化我收到的一些代码,我在每个表单上发现了一些复制粘贴的函数,我希望将它们减少到一个(如果在单独的.cs文件中更好),并从不同的表单访问它 例如:我在Form1和Form2上有标签,我希望根据每个表单上复选框的.Checked属性更改其颜色。很明显,cb_colorear在Form1中找到了控件。我尝试像(String formName)一样传递它
//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)
}