这是我的第一个问题。我是一个完全新手(我有一些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);
}
但是,虽然它有效,但这是适当的解决方案吗?
答案 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;
}
}
}
那我们在这里做了什么:
Extensions
作为示例)。this Form form
而不仅仅是Form form
)。这个单一的关键字有所不同。这是将我们的常规方法转变为扩展的原因。form
和任何其他参数一样。我们无需return
Color
,因为我们可以直接设置标签的BackColor
属性。声明扩展方法后,我们可以在任何形式中执行以下操作:
private void SomeFormMethod()
{
this.cb_colorear(checkBox.Name, label.Name)
}
第一个参数隐式传递给扩展方法,允许我们使用this.method()
语法。