Solved

i can't close the form when textbox validation is there , what can i do now ??

Posted on 2011-03-07
6
497 Views
Last Modified: 2012-05-11
currently i am working on C#.net windows application ...
in my application i can't close the form when textbox validation is there , what can i do now ??

please refer the below code ...

private void Admin_Load(object sender, EventArgs e)
        {
            //Get Form Properties
            Form objform = this.FindForm();
            objGeneral.GetFormProperties(objform);

            pctBoxLogin2.Visible = false;
            lblmsg.Visible = false;
        }

        private void btnFlashObject_Click(object sender, EventArgs e)
        {
            //add constructor logic here ...
            
        }

        private void txtPasskey_TextChanged(object sender, EventArgs e)
        {
            //add constructor logic here ...
            Form objform = this.FindForm();
            pctBoxLogin2.Visible = false;
            objform.CausesValidation = true;
        }

        private void txtPasskey_Validating(object sender, CancelEventArgs e)
        {
            //add constructor logic here ...
            Form objform = this.FindForm();
            
            if (!ValidText(txtPasskey.Text))
            {
                // Cancel the event and select the text to be corrected by the user.
                objform.CausesValidation = false;
                e.Cancel = true;
                txtPasskey.Select(0, txtPasskey.Text.Length);
                pctBoxLogin2.Visible = true;
            }
        }

        public bool ValidText(string stringvalue)
        {
            if (stringvalue == "pILy^caffs")
            {
                return true;
            }
            return false;
        }

        private void btnEnter_Click(object sender, EventArgs e)
        {
            //add some logic here
            if (txtPasskey.Text == "pILy^caffs")
            {
                Results objResults = new Results();
                objResults.Show();
            }
            else
            {
                lblmsg.Visible = true;
                lblmsg.Text = "Please Enter Valid Pass Key";
            }
        }

Open in new window


anything wrong on the above code ,
how can i close form when textbox validation is there ??
0
Comment
Question by:Parth48
6 Comments
 
LVL 8

Expert Comment

by:crysallus
ID: 35066693
My guess would be that you need to set e.Cancel = false to ensure that the close isn't canceled. I think I recall reading somewhere that e.Cancel = true is actually the default. You have to specifically tell it that the close shouldn't be canceled. eg.

            if (!ValidText(txtPasskey.Text))
            {
                // Cancel the event and select the text to be corrected by the user.
                objform.CausesValidation = false;
                e.Cancel = true;
                txtPasskey.Select(0, txtPasskey.Text.Length);
                pctBoxLogin2.Visible = true;
            }
            else
                e.Cancel = false;

Open in new window

Try that anyway, see if it works.
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 35066903
First off, this code is pointless:

    Form objform = this.FindForm();

You're asking for the Form that contains "this"...which already is the Form!
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.findform(VS.80).aspx

    "Retrieves the form that the control is on."    

So everywhere you obtain the form using that construct you could simply use "this" directly.

Try this out to allow the form to be closed:

public partial class Admin_Load : Form
    {

        private bool UserClosing = false;

        public Admin_Load()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_CLOSE = 0xF060;

            if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
            {
                UserClosing = true;
            }

            base.WndProc(ref m);
        }

        private void txtPasskey_Validating(object sender, CancelEventArgs e)
        {
            if (!UserClosing && !ValidText(txtPasskey.Text))
            {
                e.Cancel = true;
                txtPasskey.SelectAll(); 
                pctBoxLogin2.Visible = true;
            }
        }

        public bool ValidText(string stringvalue)
        {
            if (stringvalue == "pILy^caffs")
            {
                return true;
            }
            return false;
        }

    }

Open in new window

0
 
LVL 1

Expert Comment

by:lalitgada
ID: 35067241
how could it be possible if set

 objform.CausesValidation = true;

check this code.
0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 

Author Comment

by:Parth48
ID: 35068572
hi @Idle_Mind: u r right , but coding is some complex , can u tell me the easy way ??

the below code i can't understand ....

protected override void WndProc(ref Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_CLOSE = 0xF060;

            if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
            {
                UserClosing = true;
            }

            base.WndProc(ref m);
        }

Open in new window


please tell me the easy way ...
0
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 500 total points
ID: 35069421
One of the root problems is that the Validating() event for the TextBox fires BEFORE the FormClosing() event of the Form.  Overriding the WndProc() method allows us to trap messages for the Form before they get routed to the proper control.  This gives us the opportunity to set the flag so we know the form is closing in the Validating event.

The SC_CLOSE message is sent when the user clicks on the 'X' in the top right of the window, or if they Right click on the window in the TaskBar and select 'Close window'.

If you want to programmatically close the window from code then you'd need to set the boolean flag manually like this:

   this.UserClosing = true;
   this.Close();

See:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx

    "All messages are sent to the WndProc method after getting filtered through the PreProcessMessage method."
0
 

Author Comment

by:Parth48
ID: 35079180
Thanks @Idle_Mind: for the help .....
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

IntroductionWhile developing web applications, a single page might contain many regions and each region might contain many number of controls with the capability to perform  postback. Many times you might need to perform some action on an ASP.NET po…
User art_snob (http://www.experts-exchange.com/M_6114203.html) encountered strange behavior of Android Web browser on his Mobile Web site. It took a while to find the true cause. It happens so, that the Android Web browser (at least up to OS ver. 2.…
I designed this idea while studying technology in the classroom.  This is a semester long project.  Students are asked to take photographs on a specific topic which they find meaningful, it can be a place or situation such as travel or homelessness.…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

930 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now