gpt4 book ai didi

c# - 窗体之间公共(public)方法的访问

转载 作者:太空宇宙 更新时间:2023-11-03 17:12:49 25 4
gpt4 key购买 nike

我正在尝试访问另一个表单 Form2 上的 Form1 的公共(public)方法,如下所示。我在 form1 上有一个 textbox6 控件,并且有一个公共(public)方法来绑定(bind)它。但我想通过 form2 绑定(bind)它,如下所示。

Form1

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

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

public void amount_sum()
{
string connstr = " server=.;initial catalog=maa;uid=mah;pwd=mah";
SqlConnection con = new SqlConnection(connstr);
con.Open();
string sql = " select sum(amount)as amount from method";
SqlDataAdapter dap = new SqlDataAdapter(sql, con);
DataSet ds = new DataSet();
dap.Fill(ds);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
textBox6.Text = Convert.ToString(ds.Tables[0].Rows[i]["amount"]);
}
}
}

Form2

private void button1_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
f1.amount_sum();
this.Close();
}

上面的方法调用是错误的。请建议如何更正它。

我想通过调用公共(public)方法从 Form2 的 Button_Click 事件处理程序绑定(bind) Form1 的 textBox6 控件,当 Form2 关闭时,Form1 的 textbox6 应该绑定(bind)。是否可以通过从 Form2 调用公共(public)方法来实现?

最佳答案

在 Form2 中你有

Form1 f1 = new Form1();
f1.amount_sum();

当您想在表单之间传回答案时,创建新的 Form1 似乎是一个常见的错误。 new 关键字就是这样做的,它创建一个新的 Form1,调用方法,不显示表单,Form1 的原始实例不受影响。

我将展示一些解决此问题的步骤。

1 - 将 Form1 传递给 Form2

您可以做的第一件事是简单地将现有的 Form1 传递给 Form2,以便 Form2 知道应该更新哪个 Form1。

public class Form2
{
private readonly Form1 _form1;
public Form2(Form1 form1)
{
_form1 = form1;
}

private void button1_Click(object sender, EventArgs e)
{
_form1.amount_sum(); // now this updates the existing form1 instance
this.Close();
}
}

在 Form1 中

private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this); // pass this form1 instance to form2
f2.Show();
}

其中一个问题是在 Form1 和 Form2 之间创建了强耦合。如果您更改 Form1 中的某些内容,很容易破坏 Form2,反之亦然。

2 - 通过委托(delegate)

我们可以简单地将委托(delegate)传递给 Form2 可以运行的更新方法,而不是将整个 Form1 传递给 Form2。这减少了 Form1 和 Form2 之间的耦合,如果您从 Form3 调用 Form2,您可以传入 Form3 的更新方法,Form3 将被更新。相同的 Form2 无需修改即可重复使用。

public class Form2
{
private readonly Action _ammountUpdater;
public Form2(Action ammountUpdater)
{
_ammountUpdater = ammountUpdater;
}

private void button1_Click(object sender, EventArgs e)
{
_ammountUpdater(); // now this updates the existing form1 instance
this.Close();
}
}

在 Form1 中

private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this.amount_sum); // pass the update method to form2
f2.Show();
}

现在您可以将 amount_sum 更改为私有(private),因为它现在实际上是 Form1 的内部事务。

关于c# - 窗体之间公共(public)方法的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4176682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com