I have two forms, one contains the datagridview and the other one contains a trackbar to change the font size of the datagridview like this:
I created the following code to allow Form2 to access Form1 datagridview:
//This is for Form1, the one that contains the datagridview:
public partial class Form1: Form
{
public Form1()
{
Form2 f = new Form2();
f.dataGridFromForm1 = dataGridView1;
}
//This is for Form2, the one that contains the trackbar:
public partial class Form2: Form
{
public DataGridView dataGridFromForm1 { get; set;}
private void trackBar1_Scroll(object sender, EventArgs e)
{
dataGridFromForm1.RowsDefaultCellStyle.Font =
new Font(dataGridFromForm1.RowsDefaultCellStyle.Font.FontFamily,
float.Parse(trackBar1.Value.ToString()));
label1.Text = trackBar1.Value.ToString() + "pt";
}
}
During the build I do not get any errors, however when I try to slide the trackbar I get the following exception:
I'm not exactly sure what I'm missing out here as I thought I had already instantiated the datagridview. Any help would be appreciated.
This is because you are creating a new Form2 and then discarding it. In other words, your constructor for Form1 does this:
public Form1()
{
Form2 f = new Form2(); // creates a new Form2
f.dataGridFromForm1 = dataGridView1; // sets the property
// f is now out of scope
}
Your f is a local variable inside the constructor. When you are showing the form later (presumably by calling Form2 f = new Form2(); again followed by f.Show()) it has no idea what the dataGridFromForm1 is (in fact its null by default).
You haven't shown enough code (your method to show the slider form is missing), but that code should probably set the slider. Perhaps something like:
private void btnShowSlider_Click(object sender, EventArgs e)
{
using (var f = new Form2()) {
f.dataGridFromForm1 = this.dataGridView1;
f.ShowDialog(this);
}
}
Note that in the above, the slider form will be a modal window and you won't be able to click back to it until you've closed it (which is probably a good thing)
Outside of that you could have a class instance variable inside Form1 that keeps track of your Form2 form showing/hiding/disposing of it as necessary. Another option would be to pass an instance of Form1 into the constructor for Form2, so it has a reference directly. That could look like this:
public partial class Form2 : Form {
private Form1 _form1;
public Form2(Form1 otherForm) {
_form1 = otherForm;
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
_form1.dataGridFromForm1.RowsDefaultCellStyle.Font =
new Font(form1.dataGridFromForm1.RowsDefaultCellStyle.Font.FontFamily,
trackBar1.Value);
label1.Text = trackBar1.Value + "pt";
}
}
and creating it in Form1 like:
Form2 f = new Form2(this);
f.Show();
making sure to dispose/etc when you are done.
Also note that TrackBar.Value is already an int and so you shouldn't need to convert it to a string and parse it again. Something like this should suffice:
new Font(..., trackBar1.Value)
try replace
public Form1()
{
Form2 f = new Form2();
f.dataGridFromForm1 = dataGridView1;
}
to
public Form1()
{
this.Load += (s,e) =>
{
Form2 f = new Form2();
f.dataGridFromForm1 = dataGridView1;
};
}
I want to pass values between two Forms (c#). How can I do it?
I have two forms: Form1 and Form2.
Form1 contains one button. When I click on that button, Form2 should open and Form1 should be in inactive mode (i.e not selectable).
Form2 contains one text box and one submit button. When I type any message in Form2's text box and click the submit button, the Form2 should close and Form1 should highlight with the submitted value.
How can i do it? Can somebody help me to do this with a simple example.
There are several solutions to this but this is the pattern I tend to use.
// Form 1
// inside the button click event
using(Form2 form2 = new Form2())
{
if(form2.ShowDialog() == DialogResult.OK)
{
someControlOnForm1.Text = form2.TheValue;
}
}
And...
// Inside Form2
// Create a public property to serve the value
public string TheValue
{
get { return someTextBoxOnForm2.Text; }
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2(textBox1.Text);
frm2.Show();
}
public Form2(string qs)
{
InitializeComponent();
textBox1.Text = qs;
}
Define a property
public static class ControlID {
public static string TextData { get; set; }
}
In the Form1
private void button1_Click(object sender, EventArgs e)
{
ControlID.TextData = txtTextData.Text;
}
Getting the data in Form1 and Form2
private void button1_Click(object sender, EventArgs e)
{
string text= ControlID.TextData;
}
After a series of struggle for passing the data from one form to another i finally found a stable answer. It works like charm.
All you need to do is declare a variable as public static datatype 'variableName' in one form and assign the value to this variable which you want to pass to another form and call this variable in another form using directly the form name (Don't create object of this form as static variables can be accessed directly) and access this variable value.
Example of such is,
Form1
public static int quantity;
quantity=TextBox1.text; \\Value which you want to pass
Form2
TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2
Declare a public string in form1
public string getdata;
In button of form1
form2 frm= new form2();
this.hide();
form2.show();
To send data to form1 you can try any event and code following in that event
form1 frm= new form1();
form1.getdata="some string to be sent to form1";
Now after closing of form2 and opening of form1, you can use returned data in getdata string.
I've worked on various winform projects and as the applications gets more complex (more dialogs and interactions between them) then i've started to use some eventing system to help me out, because management of opening and closing windows manually will be hard to maintain and develope further.
I've used CAB for my applications, it has an eventing system but it might be an overkill in your case :) You could write your own events for simpler applications
Form1 Code :
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
MessageBox.Show("Form1 Message :"+Form2.t.Text); //can put label also in form 1 to show the value got from form2
}
Form2 Code :
public Form2()
{
InitializeComponent();
t = textBox1; //Initialize with static textbox
}
public static TextBox t=new TextBox(); //make static to get the same value as inserted
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
It Works!
declare string in form1
public string TextBoxString;
in form1 click event add
private void button1_Click(object sender, EventArgs e)
{
Form1 newform = new Form1();
newform = this;
this.Hide();
MySecform = new Form2(ref newform);
MySecform.Show();
}
in form2 constructer
public Form2(ref Form1 form1handel)
{
firstformRef = form1handel;
InitializeComponent();
}
in form2 crate variable Form1 firstformRef;
private void Submitt_Click(object sender, EventArgs e)
{
firstformRef.TextBoxString = textBox1.Text;
this.Close();
firstformRef.Show();
}
In this code, you pass a text to Form2. Form2 shows that text in textBox1.
User types new text into textBox1 and presses the submit button.
Form1 grabs that text and shows it in a textbox on Form1.
public class Form2 : Form
{
private string oldText;
public Form2(string newText):this()
{
oldText = newText;
btnSubmit.DialogResult = DialogResult.OK;
}
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = oldText;
}
public string getText()
{
return textBox1.Text;
}
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
DialogResult = System.Windows.Forms.DialogResult.OK;
}
}
}
And this is Form1 code:
public class Form1:Form
{
using (Form2 dialogForm = new Form2("old text to show in Form2"))
{
DialogResult dr = dialogForm.ShowDialog(this);
if (dr == DialogResult.OK)
{
tbSubmittedText = dialogForm.getText();
}
dialogForm.Close();
}
}
Ok so Form1 has a textbox, first of all you have to set this Form1 textbox to public in textbox property.
Code Form1:
Public button1_click()
{
Form2 secondForm = new Form2(this);
secondForm.Show();
}
Pass Form1 as this in the constructor.
Code Form2:
Private Form1 _firstForm;
Public Form2(Form1 firstForm)
{
_firstForm = firstForm:
}
Public button_click()
{
_firstForm.textBox.text=label1.text;
This.Close();
}
you can pass as parameter the textbox of the Form1, like this:
On Form 1 buttom handler:
private void button2_Click(object sender, EventArgs e)
{
Form2 newWindow = new Form2(textBoxForReturnValue);
newWindow.Show();
}
On the Form 2
public static TextBox textBox2; // class atribute
public Form2(TextBox textBoxForReturnValue)
{
textBox2= textBoxForReturnValue;
}
private void btnClose_Click(object sender, EventArgs e)
{
textBox2.Text = dataGridView1.CurrentCell.Value.ToString().Trim();
this.Close();
}
Constructors are the best ways to pass data between forms or Gui Objects you can do this.
In the form1 click button you should have:
Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();
In form 2, when the user clicks the button it should have a code like this or similar:
this.Close();
Form1 form = new Form1(textBox1.Text)
form.Show();
Once inside the form load of form 1 you can add code to do anything as you get the values from constructor.
How to pass the values from form to another form
1.) Goto Form2 then Double click it. At the code type this.
public Form2(string v)
{
InitializeComponent();
textBox1.Text = v;
}
2.) Goto Form1 then Double click it. At the code type this.
//At your command button in Form1
private void button1_Click(object sender, EventArgs e)
{
Form2 F2 = new Form2(textBox1.Text);
F2.Show();
}
This is very simple.
suppose you have 2 window form Form1 and Form2 and you want to send record of textbox1 from Form1 to Form2 and display this record in label1 of Form2;
then in Form2 create a label which name is label1 and go to the property of label1 and set 'Modifiers'=public and in Form one create a textBox with id textBox1 and a button of name submit then write the following code on button click event
button1_Click(object sender, EventArgs e)
{
Form2 obj=new Form2();
obj.label1.text=textBox1.text.ToString();
obj.show();
}
thats it...
for this way you can bind dataset record to another form's datagridview......
You can make use of a different approach if you like.
Using System.Action (Here you simply pass the main forms function as the parameter to the child form like a callback function)
OpenForms Method ( You directly call one of your open forms)
Using System.Action
You can think of it as a callback function passed to the child form.
// -------- IN THE MAIN FORM --------
// CALLING THE CHILD FORM IN YOUR CODE LOOKS LIKE THIS
Options frmOptions = new Options(UpdateSettings);
frmOptions.Show();
// YOUR FUNCTION IN THE MAIN FORM TO BE EXECUTED
public void UpdateSettings(string data)
{
// DO YOUR STUFF HERE
}
// -------- IN THE CHILD FORM --------
Action<string> UpdateSettings = null;
// IN THE CHILD FORMS CONSTRUCTOR
public Options(Action<string> UpdateSettings)
{
InitializeComponent();
this.UpdateSettings = UpdateSettings;
}
private void btnUpdate_Click(object sender, EventArgs e)
{
// CALLING THE CALLBACK FUNCTION
if (UpdateSettings != null)
UpdateSettings("some data");
}
OpenForms Method
This method is easy (2 lines). But only works with forms that are open.
All you need to do is add these two lines where ever you want to pass some data.
Main frmMain = (Main)Application.OpenForms["Main"];
frmMain.UpdateSettings("Some data");
I provided my answer to a similar question here
You can use this;
Form1 button1 click
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
this.Hide();
frm2.Show();
}
And add this to Form2
public string info = "";
Form2 button1 click
private void button1_Click(object sender, EventArgs e)
{
info = textBox1.Text;
this.Hide();
BeginInvoke(new MethodInvoker(() =>
{
Gogo();
}));
}
public void Gogo()
{
Form1 frm = new Form1();
frm.Show();
frm.Text = info;
}
if you change Modifiers Property of a control in a Form to Public, another Forms can access to that control.
f.e. :
Form2 frm;
private void Form1_Load(object sender, EventArgs e)
{
frm = new Form2();
frm.Show();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(frm.txtUserName.Text);
//txtUserName is a TextBox with Modifiers=Public
}
// In form 1
public static string Username = Me;
// In form 2's load block
string _UserName = Form1.Username;
the tag Properties receive object value
( C# send value to another form )
private void btn_Send_Click(object sender, EventArgs e)
{
Form frm = new formToSend();
frm.tag = obj;
frm.ShowDialog();
}
Receive value that sent from previous form ( frm )
Ex: sent data is string ( we need to type casting first, because tag value is an object )
public Receive_Form()
{
InitializeComponent();
MessageBox.Show((string)this.Tag);
}
How about using a public Event
I would do it like this.
public class Form2
{
public event Action<string> SomethingCompleted;
private void Submit_Click(object sender, EventArgs e)
{
SomethingCompleted?.Invoke(txtData.Text);
this.Close();
}
}
and call it from Form1 like this.
private void btnOpenForm2_Click(object sender, EventArgs e)
{
using (var frm = new Form2())
{
frm.SomethingCompleted += text => {
this.txtData.Text = text;
};
frm.ShowDialog();
}
}
Then, Form1 could get a text from Form2 when Form2 is closed
Thank you.
I have two forms form1 and form2. I want to get the text from the textbox of form2 when a button is clicked on form1. I am using on form1:
private void but_Click(object sender, EventArgs e)
{
Form2 f2=new Form2();
txtonform1=f2.fo;
}
and on form2 I have this method to return the text from the textbox:
public string fo
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
Now the problem is that it returns null. Whats the problem I am new to c# can anybody help me please!
You have to work with one single form, otherwise you create new instance every time:
Form2 f2 = new Form2();
private void but1_Click(object sender, EventArgs e)
{
f2.fo=txtonform1.Text;
}
private void but2_Click(object sender, EventArgs e)
{
MessageBox.Show(f2.fo);
}
You are creating a new form instance here:
Form2 f2=new Form2();
And your fo property return this new form's textBox1, so you textBox1 doesn't contain any text and you are getting null.
I guess you are displaying form2 from Form1, if it's correct just define a one Form2 intance in class level:
public partial class Form1 : Form
{
Form2 f2 = new Form2();
}
And when you want to show it use this:
f2.Show(this);
When you want to change your TextBox value now you can use:
txtonform1.Text = f2.fo;
But to do this make sure you change your textBox1.Text in form2.
You should keep the reference of form2 which is/was already displayed, in form1 and then use the same variable to access the value.
I don't know how form2 was created and shown but assuming it's created and shown by some button click on form1 then form1 class will look something like,
private Form f2 = null;
private void buttonShowForm2_Click(object sender, EventArgs e)
{
if(f2 == null)
f2 = new form2();
f2.Show();
}
private void but_Click(object sender, EventArgs e)
{
if(f2 == null) //If this form was not already displayed display it to get the input from user
buttonShowForm2_Click(null, null);
else
txtonform1=f2.fo;
}
FIRST SOLUTION:
1.) Goto Form2 then Double click it. At the code type this.
public Form2(string sTEXT)
{
InitializeComponent();
textBox1.Text = sTEXT;
}
2.) Goto Form1 then Double click it. At the code type this.
//At your command button in Form1
private void button1_Click(object sender, EventArgs e)
{
Form2 sForm = new Form2(textBox1.Text);
sForm.Show();
}
SECOND SOLUTION:
1.) Goto Form1 then Double Click it. At the code type this.
public string CaptionText
{
get {return textBox1.Text;}
set { textBox1.Text = value;}
}
note: the value of your textbox1.text = sayre;
2.) Goto Form2 then Double click it. At the code type this.
// At your command button In Form2
private void button1_Click(object sender, EventArgs e)
{
Form1 sForm1 = new Form1();
textBox1.Text = sForm1.CaptionText;
}
So, I have two forms -- one that is open, and another that is essentially just a popup on the second one. The second form opens with a maskedtextbox inside it, plus Save and Cancel buttons -- I want Save to change a field on the first form.
As far as I know, I have to use a second form for my popup since what I want to accomplish isn't as simple as something I could put in a MessageBox -- if there is another option, I'm all ears.
What I've been trying:
Form 1:
public partial class Form1 : Form
{
public void ChangeLabel()
{
label1.Text = StaticVariables.labelString;
}
}
Form 2:
public partial class Form2 : Form
{
private void changeForm1_Click(object sender, EventArgs e)
{
StaticVariables.labelString = textBox.Text;
Form1 frm = new Form1();
frm.ChangeLabel();
}
}
Obviously, that hasn't worked.
There's no need for the second form to know about the first form at all. Having it know about it complicates its code, and needlessly ties it to that form. Having another form knowing about the internal UI components of the main form is even worse; if you do that then changes to how the main form displays the data would break this other form. Just have the popup have a property representing the value that lets it be set/fetched externally:
public partial class Form2 : Form
{
public string Result //TODO give better name
{
get { return textBox.Text; }
}
public string DisplayText //TODO give better name
{
get { return label.Text; }
set { label.Text = value; }
}
}
Then the main form can set the display value, show the form, and fetch the resulting value:
Form2 popup = new Form2();
popup.DisplayText = "asdf";
popup.ShowDialog();
myField = popup.Result;
You need to create a new constructor that receives an instance of Form1 and store that as a field in Form2. Then, when you want to change the label use the instance that was passed in. I'm answering from my phone so when I get to my desk I can elaborate with code.
But what's happening here is that you're creating a new Form1 and setting the value.
private Form1 _form1;
...
public Form2(Form1 form1)
{
_form1 = form1;
}
...
private void changeForm1_Click(object sender, EventArgs e)
{
StaticVariables.labelString = textBox.Text;
_form1.ChangeLabel();
}
and then finally, when you launch Form2:
var form2 = new Form2(this);
form2.Show();
I am trying to disable some of the combo boxes in form 2 based in form 1 selected value.
Lets say
In Form1 if comboxbox value is 0
Disable certain combo boxes in form 2
What I have done in form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public ComboBox combo
{
get { return dropdown; }
}
and in form 2 so far
private void Form2_Load(object sender, EventArgs e)
{
Form1 f = new Form1();
if (f.combo.SelectedIndex == 0)
{
comboBox1.Enabled = false;
}
This is not working and I cant sort it out (new to c#)
If you create Form1 at Form with this syntax:
Form1 f = new Form1();
You will get new instance of Form1 (or "copy"), not the one thats already open. You need to pass the reference of Form1 to Form2.
Put this code into Form2:
private Form1 myParentForm;
public Form2(Form1 parentForm)
{
myParentForm = parentForm;
}
Then you can use Form1 through a variable myParentForm. Like this:
private void Form2_Load(object sender, EventArgs e)
{
if (myParentForm.combo.SelectedIndex == 0)
{
comboBox1.Enabled = false;
}
}
In Form1 you have a code something like this:
Form2 mySecondForm = new Form2();
change that to:
Form2 mySecondForm = new Form2(this);
Here is a prior answer with multiple samples calling one form as parameter to another including one of those as a full step-by-step sample.
Now, with respect to enable/disable, you can use either property or method approach to tell the "Other" form to enable / disable the status... The samples are just setting / getting values. If you do a set such as boolean to the one form in question, your setter portion might be something like
private bool enableFromOtherForm;
public bool EnableFromOtherForm
{
get { return enableFromOtherForm; }
set { this.controlToChange.IsEnabled = value; }
}