Passing Variable to Parent form
-
Hi, i have a login form as a child form. I want to pass the value txtUsername to the parent form. How do i do it?
-
Hi, i have a login form as a child form. I want to pass the value txtUsername to the parent form. How do i do it?
There's a great article on this here on CP. Short answer - a delegate.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
Hi, i have a login form as a child form. I want to pass the value txtUsername to the parent form. How do i do it?
-
See, apart from being ugly as all sin, that plain doesn't work. He wants to send a message back to the parent, so how does the parent know that the child value has changed. Delegates solve both these problems, they are not ugly and they go in any direction.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
See, apart from being ugly as all sin, that plain doesn't work. He wants to send a message back to the parent, so how does the parent know that the child value has changed. Delegates solve both these problems, they are not ugly and they go in any direction.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
There's a great article on this here on CP. Short answer - a delegate.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
i seen the article on delegate here http://www.codeproject.com/KB/cs/event_fundamentals.aspx#3.Delegates2[^ But i dont quite understand how it works. can u give me a simple example?
-
Hi, i have a login form as a child form. I want to pass the value txtUsername to the parent form. How do i do it?
-
i prefer a form with textbox nicer and more professional
-
Yes, but some of us write professional code, not just whatever works ( and your solution still does not work )
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
i prefer a form with textbox nicer and more professional
-
i seen the article on delegate here http://www.codeproject.com/KB/cs/event_fundamentals.aspx#3.Delegates2[^ But i dont quite understand how it works. can u give me a simple example?
If the child form contains this code public delegate void SendString(string s); public SendString OnSendString = null; Then your main form can do this public void GetString(string theString) { } and in your code that creates the child form: MyChild dlg = new MyChild(); dlg.OnSendString += new MyChild.SendString(this.GetString); Then when the child form does this: if (OnSendString != null) OnSendString("test"); the value "test" is called in GetString in the parent form. All of this assumes your child form is modeless. If it's modal, then you may as well just assign properties like the other guy said. I assumed that it was modeless from your initial question, you said you want to send something back to the main form. But, if the child form has been closed, then you're not sending anything, properties make more sense in that case. I can't find the article on communication between forms :(
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
Yes, if the form is modal, then it makes sense to do what you suggested, I just assumed from the question wording that it was modeless. In that case, I apologise, I would use properties and the DialogResult to return a value from a modal form.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
If the child form contains this code public delegate void SendString(string s); public SendString OnSendString = null; Then your main form can do this public void GetString(string theString) { } and in your code that creates the child form: MyChild dlg = new MyChild(); dlg.OnSendString += new MyChild.SendString(this.GetString); Then when the child form does this: if (OnSendString != null) OnSendString("test"); the value "test" is called in GetString in the parent form. All of this assumes your child form is modeless. If it's modal, then you may as well just assign properties like the other guy said. I assumed that it was modeless from your initial question, you said you want to send something back to the main form. But, if the child form has been closed, then you're not sending anything, properties make more sense in that case. I can't find the article on communication between forms :(
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
How do i know if my file is modeless or modal? I did not close my child form. I use .Hide(). I dont know whether i should close the form or use Hide. probably u might wanna take a look at my file here is my project file http://opencube.com.sg/EBMS.zip
-
How do i know if my file is modeless or modal? I did not close my child form. I use .Hide(). I dont know whether i should close the form or use Hide. probably u might wanna take a look at my file here is my project file http://opencube.com.sg/EBMS.zip
If you call ShowDialog, it's modal. IF you call Show, so the parent form stays active, it's modeless, and that's why you need a delegate. If your main form code stops when you show the child, your main form code knows when the otehr form ends it's life, so you can examine it's state. If you called Show, you don't know when the child form has something to tell you, a delegate lets the form tell you. If you call Hide, then you're calling Show, I guess. Otherwise, your modal form would freeze your application. A login form has to be modal, or there's no point. A properties form, would be modeless, you change properties and see the results in the main form. Just some examples.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
If you call ShowDialog, it's modal. IF you call Show, so the parent form stays active, it's modeless, and that's why you need a delegate. If your main form code stops when you show the child, your main form code knows when the otehr form ends it's life, so you can examine it's state. If you called Show, you don't know when the child form has something to tell you, a delegate lets the form tell you. If you call Hide, then you're calling Show, I guess. Otherwise, your modal form would freeze your application. A login form has to be modal, or there's no point. A properties form, would be modeless, you change properties and see the results in the main form. Just some examples.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
Oh, so inside my FrmMain_Load(), i tried set my childLogin to ShowDialog i get this error "Form that is not a top-level form cannot be displayed as a modal dialog box. Remove the form from any parent form before calling showDialog." private void FrmMain_Load(object sender, EventArgs e) { this.toolStripStaff.Visible = false; this.toolStripCatalogue.Visible = false; this.toolStripProduct.Visible = false; this.toolStripOrder.Visible = false; this.toolStripInventory.Visible = false; FrmLogin childLogin = new FrmLogin(); childLogin.MdiParent = this; childLogin.ShowDialog(); stripLblLoginAs.Text = "Login As :"; }
-
Oh, so inside my FrmMain_Load(), i tried set my childLogin to ShowDialog i get this error "Form that is not a top-level form cannot be displayed as a modal dialog box. Remove the form from any parent form before calling showDialog." private void FrmMain_Load(object sender, EventArgs e) { this.toolStripStaff.Visible = false; this.toolStripCatalogue.Visible = false; this.toolStripProduct.Visible = false; this.toolStripOrder.Visible = false; this.toolStripInventory.Visible = false; FrmLogin childLogin = new FrmLogin(); childLogin.MdiParent = this; childLogin.ShowDialog(); stripLblLoginAs.Text = "Login As :"; }
benjamin yap wrote:
childLogin.MdiParent = this;
This is why you can't do it. Get rid of this line, it makes no sense to have it. Set te Owner property instead ( or Parent, I forget which, but I think it's Owner you want ). This stops your modal form from ever being hidden by it's parent.
benjamin yap wrote:
stripLblLoginAs.Text = "Login As :";
This is going to occur *after* your login form has shown. Now the easy easy way to make this work is to set the DIalogResult to DialogResult.OK only if the login succeeds. Then you can do if (childLogin.ShowDialog() == DialogResult.OK) { // logged in } else { // failed, close the program or whatever }
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
Oh, so inside my FrmMain_Load(), i tried set my childLogin to ShowDialog i get this error "Form that is not a top-level form cannot be displayed as a modal dialog box. Remove the form from any parent form before calling showDialog." private void FrmMain_Load(object sender, EventArgs e) { this.toolStripStaff.Visible = false; this.toolStripCatalogue.Visible = false; this.toolStripProduct.Visible = false; this.toolStripOrder.Visible = false; this.toolStripInventory.Visible = false; FrmLogin childLogin = new FrmLogin(); childLogin.MdiParent = this; childLogin.ShowDialog(); stripLblLoginAs.Text = "Login As :"; }
-
Yes, you can pass it on the constructor quite often, instead of setting it first. I know you can for a messagebox, for example.
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
-
benjamin yap wrote:
childLogin.MdiParent = this;
This is why you can't do it. Get rid of this line, it makes no sense to have it. Set te Owner property instead ( or Parent, I forget which, but I think it's Owner you want ). This stops your modal form from ever being hidden by it's parent.
benjamin yap wrote:
stripLblLoginAs.Text = "Login As :";
This is going to occur *after* your login form has shown. Now the easy easy way to make this work is to set the DIalogResult to DialogResult.OK only if the login succeeds. Then you can do if (childLogin.ShowDialog() == DialogResult.OK) { // logged in } else { // failed, close the program or whatever }
Christian Graus Please read this if you don't understand the answer I've given you "also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
Christian, i am very sorry for asking so many question, I just started c# few days ago. Please bear with me childLogin.MdiParent = this; --> i though this is to link to the parent form? How do i set to owner property?
-
It also breaches one of the tenets of Object Oriented programming.
Upcoming FREE developer events: * Developer Day Scotland Recent blog posts: * Introduction to LINQ to XML (Part 1) - (Part 2) My website | Blog