表格之间公共方法的访问

mah*_*esh 1 .net c# winforms public-method

我试图在Form2的另一个窗体上访问Form1的公共方法,如下所示.我textbox6对form1 有一个控件,并且有绑定它的公共方法.但是我想用form2绑定它,如下所示.

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"]);
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)

窗体2

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

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

我想通过调用public方法textBox6从Form2的Button_Click事件处理程序绑定Form1的控件,当Form2关闭时,textbox6应该绑定Form1 .可以通过从Form2调用公共方法吗?

Alb*_*nbo 11

在Form2中你有

Form1 f1 = new Form1();
f1.amount_sum();
Run Code Online (Sandbox Code Playgroud)

当您想要在表单之间传回答案时,这似乎是创建新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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在Form1中

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

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

2 - 通过代表

我们可以简单地将委托传递给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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在Form1中

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

现在你可以amount_sum改为私有,因为它现在真的是Form1的内部事务.