I am trying to get access to Form1’s public method on another form Form2 as below. I have a textbox6
control on form1 and there is public method to bind it. But
I would make your amount_sum
method a utility method that returns the value, for example:
public static decimal GetTotalFoobarAmount()
{ // decimal is just a guess here
// omitted: sql code
return theAnswer;
}
Then both blocks of code can call this method, for example.
textBox6.Text = YourClass.GetTotalFoobarAmount().ToString();
As a side-benefit, it also reduces coupling between your UI and DB, which is generally considered a good thing. If the query requires values currently from the form, make those parameters in the method. Note also that for returning a single value you might want to look at ExecuteScalar
; it isn't going to make a massive difference, but it is more direct than populating a DataTable
and looping over the single row.
Also you may use events:
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ButtonClickAction += f2_ButtonClickAction;
f2.Show();
}
void f2_ButtonClickAction()
{
amount_sum();
}
Form2:
public Form2()
{
InitializeComponent();
}
public event Action ButtonClickAction;
private void button1_Click(object sender, EventArgs e)
{
Action a = ButtonClickAction;
if (a != null)
a();
this.Close();
}
Marc Gravell's answer is probably sufficient, but in general, if you want to call an instance method on a specific instance of a class, you can't just create a new one and call it on that instance. For your example, you need to call the method on the Form1 instance that already exists. The best way to do that is to have a member variable on the Form2 class of type Form1. You can define a constructor or a property on Form2 which takes a value of type Form1 and set the member variable in it. When Form1 creates an instance of Form2, it can call the constructor and pass in this
or set the property to this
. Then when the button is clicked on Form2, instead of creating a new instance of Form1, it can call the amount_sum()
method on the Form1 instance that is already stored.
In Form2 you have
Form1 f1 = new Form1();
f1.amount_sum();
This seems to be a common mistake to create a new Form1 when you want to pass the answer back between forms. The new
keyword does just that, it creates a new Form1, calls the method, does not show the form, the original instance of Form1 is unaffected.
I'll show some steps how to fix this.
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();
}
}
In Form1
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this); // pass this form1 instance to form2
f2.Show();
}
One issue with this is that is creates a strong coupling between Form1 and Form2. If you change something in Form1 it is easy to break Form2 and the other way around.
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();
}
}
In Form1
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this.amount_sum); // pass the update method to form2
f2.Show();
}
Now you can change amount_sum
to private since it is now really an internal affair of Form1.