I have three forms in my application.
Form1 is the main form.
Form2 is a form with two input fields.
Form3 is a password verification form which is triggered from Form1 and upon successful authentication, Form2 is shown.
Form1 -> Form3 -> Form2
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.textBox_entry_password.Text))
{
MessageBox.Show("Please enter a password", "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
this.textBox_entry_password.Focus();
}
else
{
// Authentication not Implemented so far
Form Form2 = new Form2();
Form2.StartPosition = FormStartPosition.CenterScreen;
// Code for hiding Form3 -- Needed ????
Form2.ShowDialog();
}
I want Form1 to stay as such and hide Form3 and show Form2.
this.hide()
hides Form1.
If i try
Form Form3 = new Form3();
Form3.Hide();
It does nothing. Form3 stays right there.
How do i hide Form3?
try this :
Form2 a = new Form2 ();
a.Show();
this.Close();
in the button click event inside Form3
Create an overload of your Form3() constructor and pass Form1 instance to it.
private Form form;
public Form3(Form frm)
{
form = frm;
}
Now wherever you want to hide/show form1, just use form.Hide(), form.Show();
In your case use
if (string.IsNullOrEmpty(this.textBox_entry_password.Text))
{
MessageBox.Show("Please enter a password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
this.textBox_entry_password.Focus();
}
else
{
// Authentication not Implemented so far
Form Form2 = new Form2();
Form2.StartPosition = FormStartPosition.CenterScreen;
// Code for hiding Form3 -- Needed ????
Form2.ShowDialog();
this.Hide();
form.ShowDialog();
}
Ther are many ways to do this. Below is an approach that I like because the password form is only concerned with obtaining and authenticating a password, and knows nothing about Form1 and Form2.
Code in Form3:
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.textBox_entry_password.Text))
{
MessageBox.Show("Please enter a password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
this.textBox_entry_password.Focus();
}
else
{
// Authentication code here
// if (isAuthenticated)
// {
// DialogResult = DialogResult.OK;
// Close(); // hides and closes the form
// }
}
}
Code in Form1, to use Form 3 and Form2:
var dialogResult = DialogResult.Cancel;
// Always explicitly dispose a form shown modally; using clause will do this.
using (var form3 = new Form3())
{
dialogResult = form3.ShowDialog(this);
}
if (dialogResult == DialogResult.OK) // password authenticated
{
// Always explicitly dispose a form shown modally; using clause will do this.
using (var form2 = new Form2())
{
dialogResult = form2.ShowDialog(this);
}
}
Related
I'm practicing some C# and I decided to make an extremely simple login screen. I would like the login screen to close after the password is entered successfully, but I cannot seem to do it.
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "pwhere")
{
Form2 form2 = new Form2();
Form1 form1 = new Form1();
{
form2.ShowDialog();
form1.Close();
}
}
}
Thanks! :)
This button is in Form1 if that causes any trouble btw.
Fixed it.
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "rbxgod")
{
Form2 form2 = new Form2();
form2.Show();
Hide();
}
}
This button is in Form1 if that causes any trouble btw.
Assuming Form1 is your startup form, you can hide it, then call ShowDialog() with Form2, and finally close the original Form allowing the application to exit gracefully:
this.Hide();
Form2 f2 = new Form2();
f2.ShowDialog();
this.Close();
Alternatively, you could wire up the FormClosed() event of Form2 and close the current form from there. This would allow you to use Show() instead of ShowDialog():
this.Hide();
Form2 f2 = new Form2();
f2.FormClosed += (s2, e2) => { this.Close(); };
f2.Show();
I'm having a strange problem ... I have two forms (Form1 & Form2). Form1 calls with an old name (string) and the user enters a new name (textbox1) in Form2 which is returned to Form1. Everything works fine if they enter a value or cancel ... however I want to put an error check to insure they enter a value, among other things. The error check works fine, but after the error, when a correct value is entered, form2 closes but nothing happens.
I put in some breakpoints and Form1 seems to hold on the using(form2 ...) statement, waiting for Form2 to finish, but after firing the error message, nothing happens.
If I remove the ... Form2 F2 = new Form2 ... Form2 just closes and returns to Fomr1. Ideally I'd like to stay on Form2 until a value gets entered or the user cancels.
What am I missing?
// Form1
using(Form2 F5 = new Form2(SelNm))
{
if(F5.ShowDialog()== DialogResult.OK)
{
//Do stuff
}
}
// Form2
public string newName { get; set; }
public string oldName { get; set; }
public Form2(string oldNm)
{
InitializeComponent();
oldName = oldNm;
}
private void btnOK_Click(object sender, EventArgs e)
{
if (textbox1.Text.Length > 0)
{
newName = textbox1.Text;
DialogResult = DialogResult.OK;
Close();
}
else
{
MessageBox.Show("ERROR: Must enter a new name.");
DialogResult = DialogResult.Cancel;
Form2 f2 = new Form2(oldName);
f2.Show();
Close();
}
}
The reason for this is that you called a new Form2 after the error dialog is shown. This is not the instance of the Form2 which Form1 is waiting for. Instead of calling a new Form2 why not re-use the current Form2?
Instead of this:
MessageBox.Show("ERROR: Must enter a new name.");
DialogResult = DialogResult.Cancel;
Form2 f2 = new Form2(oldName);
f2.Show();
Close();
Why not this?
MessageBox.Show("ERROR: Must enter a new name.");
// Do not close the form so the user can
// input again
Update:
As suggested on the comments..
private void textbox1_TextChanged(object sender, RoutedEventArgs e)
{
btnOK.Enabled = !string.IsNullOrWhiteSpace(textbox1.Text);
}
I have 3 Form. I want to show Form3 and close Form1, Form2 when click button in Form2. This is my code . when I run this code it can show Form3 but not close Form1.
Form1
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.ShowDialog();
//frm2.Show();
}
Form2
private void button1_Click(object sender, EventArgs e)
{
Form3 frm3 = new Form3();
Form1 frm1 = new Form1();
frm3.Show();
frm1.Hide(); // It not close Form1
this.Hide();
// frm1.Close();
// this.Close();
}
Problem : You are creating the newinstance of Form1 and then trying to close/hide it.
Solution: You need to get the Form1 instance which was already in Memory and then hide or close it.
Replace This:
Form1 frm1 = new Form1();
frm1.Hide(); // It not close Form1
With This:
Form1 form1 = (Form1) Application.OpenForms["Form1"];
Form3 frm3 = new Form3();
frm3.Show();
form1.Hide();
I am using Visual studio 2012. I created two forms, form1 with a button to open form2 and the form2 has a button "exit" which will take me back to form1.
this is my code from form 1:
private void btnRecords_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.ShowDialog();
this.Hide();
}
and from form 2:
private void btnExit_Click(object sender, EventArgs e)
{
this.Hide();
}
I know I can use frm2.Show(); this.Hide(); instead of frm2.showdialog();. But, I need my form 1's state to be unaltered. My form1 contains a login form, which only enables the buttons (such as the new form button) if the login is correct. So if I hide form1 and just show it again, the login resets;
On Form2 class add a property to store the reference to the parent form:
public Form ParentForm { get; set; }
Then on Form1, you can show Form2 this way, hiding Form1 at the same time:
private void btnRecords_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.ParentForm = this;
this.Hide();
frm2.ShowDialog();
}
When closing Form2, you can show Form1 again:
private void btnExit_Click(object sender, EventArgs e)
{
this.ParentForm.Show();
this.Close();
}
Or even better, close Form2 this way:
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (this.ParentForm != null)
this.ParentForm.Show();
}
This will also show Form1 back if we the user closes Form2 using the cross button in the title bar.
Why don't you handle the login in the form_load event of the main form. The form_load does not run every time the form regains focus. Is it appropriate to close the form on them if they do not login on load? In my case, I send an email with the username of windows user to Domain administrators and close the program. They have to reopen the program to give it another go.
private void frmMain_Load(object sender, EventArgs e)
{
//Check login
Form frmLogin = new Form();
frmLogin.ShowDialog();
if (frmLogin.LoginSucessful == true)
{
btnRecords.Enabled = true;
lblWarning.Visible = false;
}
else
{
btnRecords.Enabled = false;
lblWarning.Visible = true;
lblWarning.Text = "You must first Login";
}
//other setup code here
}
In (Form1) i have a setting button, when i click on it a new form ( Form2 ) is shown, using these lines of code :
private void b7_Click(object sender, EventArgs e)
{
Form3 frm = new Form3();
frm.Show();
}
In form3, i have 6 text boxes, and two button, Save and Cancel.
What i'm trying to do is to provide this form to the user so he types the neccessary data into the form, then he click the Save Settings button. In Form1, i want to access to these text boxes to get their current values ( when user clicked save settings ). I tried to add a Form4 and named it ( MiddleForm), i added 6 text boxes to it, and in Form3 (The form in the image above) i wrote these line :
private void button2_Click(object sender, EventArgs e)
{
MiddleForm mf = new MiddleForm();
mf.textBox1.Text = keywrd1.Text;
mf.textBox2.Text = keywrd2.Text;
mf.textBox3.Text = keywrd3.Text;
mf.textBox4.Text = keywrd4.Text;
mf.textBox5.Text = keywrd5.Text;
mf.textBox1.Text = thelink.Text;
Close();
}
then i tried to access the values passed to the MiddleForm from Form1 (The form where i need to use the textboxes values), in Form1, i wrote these lines (for debug purposes only)
MiddleForm mf = new MiddleForm();
MessageBox.Show(mf.textBox1.Text); // to see whether there is something
Unfortunately, it seems that nothing is passed to mf.TextBox1
How can i call the current values (Saved using save settings button) of Form3 From Form1 in order to use them in the rest of code.
Any help please on getting this to work ?
Make 6 public properties in your Form3 like that:
public partial class Form3 : Form
{
public string Value1
{
get { return this.keywrd1.Text; }
}
public string Value2
{
get { return this.keywrd2.Text; }
}
...
}
After your Form3 is closed (but before disposed) you can access text values via properties. As pointed in another answer, use ShowDialog instead of Show and close Form3 inside it's own code.
private void b7_Click(object sender, EventArgs e)
{
Form3 frm = new Form3();
frm.ShowDialog();
string value1 = frm.Value1;
...
}
Make public properties in Form3 like this
public string[] Keys
{
get
{
return new string[] { tbKey1.Text, tbKey2.Text, tbKey3.Text,
tbKey4.Text, tbKey5.Text};
}
}
public string Link { get { return tbLink.Text; } }
From Form1 you can access these properties like this
Form3 frm = new Form3();
if (frm.ShowDialog() == DialogResult.OK) {
string[] keys = frm.Keys;
string link = frm.Link;
}
Note: It is important that you use ShowDialog and not Show, since Show does not wait for the other form to close. Also, when "Save settings" is clicked in Form3, set the dialog result
DialogResult = DialogResult.OK;
Close();
so that you can check it in Form1 as shown above.
You need to do this:
var form = Form.ActiveForm as Form3;
String myText = form.txtBoxName.Text;
You should make a public field that provides the values you want to get out of the form. If you go to the source of Form1, you should add in something like this:
public string TextValue1 {
get {return TextBox1.Text;}
}
Now, you can use the Form1.TextBox1 to retrieve a string value from your Textbox.
You could try using ShowDialog it will create your Form as a Model Dialog box, you can then check the DialogResult to know wether the data was saved or the Form was canceled.
i.e.
private void button2_Click(object sender, EventArgs e)
{
Form3 frm = new Form3();
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
savedSettings = frm.getTextBoxValues();
}
}
Form3
public partial class Form3 : Form
{
string[] textValues = new string[6];
public Form3()
{
InitializeComponent();
}
public string[] getTextBoxValues()
{
return textValues;
}
private void saveSettings_Click(object sender, EventArgs e)
{
DialogResult = System.Windows.Forms.DialogResult.OK;
textValues[0] = textBox1.Text;
textValues[1] = textBox2.Text;
textValues[2] = textBox3.Text;
textValues[3] = textBox4.Text;
textValues[4] = textBox5.Text;
textValues[5] = textBox6.Text;
this.Close();
}
private void cancelSettings_Click(object sender, EventArgs e)
{
DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Close();
}
}