我有“formA”和2个按钮(button1和button2)。我想做的是: 当我点击button1来调用label1中写的“formB”显示文本时。 当我单击button2调用相同的表单(“formB”)时,隐藏label1并显示label2。
问题是我不知道如何检查“formA”上点击的按钮。
编辑:非常感谢大家的快速回答。问题解决了!
答案 0 :(得分:3)
这是事件派上用场的地方:
public class FormA
{
private void button1_Click(object sender, EventArgs e)
{
formB.Button1WasClicked();
}
private void button2_Click(object sender, EventArgs e)
{
formB.Button2WasClicked();
}
}
public class FormB
{
public void Button1WasClicked()
{
label2.Visible = false;
label1.Visible = true;
label1.Text = "Button 1 was clicked!";
}
public void Button2WasClicked()
{
label1.Visible = false;
label2.Visible = true;
label2.Text = "Button 2 was clicked!";
}
}
button1
和button2
有自己独立的Click事件处理程序。通过这种方式,我们可以在点击它们时区分它们。
如果两个按钮都有相同的事件处理程序(如其中一个注释中所述),则可以使用sender
参数识别它们:
Object.ReferenceEquals(sender, button1);
或
Object.ReferenceEquals(sender, button2);
然后你的代码看起来像这样:
private void button_Click(object sender, EventArgs e)
{
if (Object.ReferenceEquals(sender, button1))
{
formB.Button1WasClicked();
}
else
{
formB.Button2WasClicked();
}
}
答案 1 :(得分:1)
FormB无法找到,这些按钮是FormA的私有实现细节。它们甚至可能不是一个按钮,当然你有一天会向FormA添加菜单或工具栏。
如果您不再考虑“调用表单”,那么解决方法会变得更加简单。你永远不会调用表单,你创建它的一个实例。然后通过调用Show()方法使其可见。在这两个步骤之间你可以做很多事情。
向FormB添加公共方法。缺乏一个更好的名字:
public void MakeLabel2Visible() {
this.label1.Visible = false;
this.label2.Visible = true;
}
现在变得简单了。实现button2的Click事件处理程序,如下所示:
private void button2_Click(object sender, EventArgs e) {
var frm = new FormB();
frm.MakeLabel2Visible();
frm.Show();
}
将另一个构造函数添加到允许您以不同方式初始化它的表单是另一种非常常见的方法。这些只是类,标准编程技术是合适的。
答案 2 :(得分:0)
因为你使用winforms,所以你可以很容易地做到这一点,因为你有一个有状态的环境。
假设一个非常基本的设置:
您的代码将是这样的:
public partial class FormA : Form
{
private FormB formB;
public FormA()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (formB == null || formB.IsDisposed)
{
formB = new FormB();
}
formB.UpdateLabel("Button A");
formB.Show();
}
private void button2_Click(object sender, EventArgs e)
{
if (formB == null || formB.IsDisposed)
{
formB = new FormB();
}
formB.UpdateLabel("Button B");
formB.Show();
}
}
public partial class FormB : Form
{
public FormB()
{
InitializeComponent();
}
public void UpdateLabel(string message)
{
label1.Text = message;
}
}
当然,对此有很多改进 - 更智能地使用事件和警报以及重构以消除重复,但这是您可以做的事情的基本示例。