Leave event in C#????????????????

  • Thread starter Thread starter bob
  • Start date Start date
B

bob

Hi there,
I have a Windows form with a couple of text boxes on it. I'm trying to
use Leave event to capture user's input. It works fine between text
boxes. The problem arises when user clicks on any menu controls on the
form, the Leave event would not get fired.
Any idea why and how to go around it?

Regards,
Bob
 
If you derive your own control from TextBox you can override the OnLostFocus
event, like this:

class MyTextBox : TextBox
{
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus (e);
}
}

Then use MyTextBox controls instead of TextBox controls and figure out how
you want to handle the lost focus event.

John.
 
Thanks John for your reply.
The problem is that the text box doesn't raise Leave event when user
clicks on the menu control.

Regards,
Bob
 
The enter and leave events are triggered when focus changes
from one window to another. A menu is not a window so it
cannot receive focus. Hence the textbox never loses focus.
Hence no leave event is fired.

Use the Validate event instead and explicitly call Validate
on your form (see ContainerControl.Validate) from your
menu handler

/claes
 
Thanks for suggestion, but it didn't work. According to help
ContainerControl.Validate should raise validate for each child control
that needs to be validated. I clicked on the text field, then clicked
on the menu where I have following code:

this.Validate();

Nothing happened... I still don't understand why Leave event occur
only within ContainerControl and doesn't get propagated up to the
form/window level.

Thanks,
Bob
 
It works for me

Are you sure you're handling the Validated event?
(the Validating event will also work)

Are you using the correct instance when you're calling
Validate. It must be the the form that contains your textbox

I've included a sample for you at the end of this post

/claes

bob said:
Thanks for suggestion, but it didn't work. According to help
ContainerControl.Validate should raise validate for each child control
that needs to be validated. I clicked on the text field, then clicked
on the menu where I have following code:

this.Validate();

Nothing happened... I still don't understand why Leave event occur
only within ContainerControl and doesn't get propagated up to the
form/window level.

Thanks,
Bob


****************** Sample ******************

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace ValidateTest
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(80, 56);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 0;
this.textBox1.Text = "";
this.textBox1.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox1_Validating);
this.textBox1.Validated += new
System.EventHandler(this.textBox1_Validated);
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(80, 96);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 1;
this.textBox2.Text = "";
this.textBox2.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox2_Validating);
this.textBox2.Validated += new
System.EventHandler(this.textBox2_Validated);
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem2});
this.menuItem1.Text = "Menu 1";
//
// menuItem2
//
this.menuItem2.Index = 0;
this.menuItem2.Text = "Menu Item 1";
this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void textBox1_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validated");
}

private void textBox1_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validating");
}

private void textBox2_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validated");
}

private void textBox2_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validating");
}

private void menuItem2_Click(object sender, System.EventArgs e)
{
this.Validate();
}
}
}
 
Claes,
To simplify my question I used text box control as an example. In
reality I have a UserControl class that has a few text boxes. The
control is on a form which also has a menu control. I tried to apply
your suggestion (this.Validate) to my scenario and it didn't work (?).

Regards,
Bob



Claes Bergefall said:
It works for me

Are you sure you're handling the Validated event?
(the Validating event will also work)

Are you using the correct instance when you're calling
Validate. It must be the the form that contains your textbox

I've included a sample for you at the end of this post

/claes

bob said:
Thanks for suggestion, but it didn't work. According to help
ContainerControl.Validate should raise validate for each child control
that needs to be validated. I clicked on the text field, then clicked
on the menu where I have following code:

this.Validate();

Nothing happened... I still don't understand why Leave event occur
only within ContainerControl and doesn't get propagated up to the
form/window level.

Thanks,
Bob


****************** Sample ******************

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace ValidateTest
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(80, 56);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 0;
this.textBox1.Text = "";
this.textBox1.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox1_Validating);
this.textBox1.Validated += new
System.EventHandler(this.textBox1_Validated);
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(80, 96);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 1;
this.textBox2.Text = "";
this.textBox2.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox2_Validating);
this.textBox2.Validated += new
System.EventHandler(this.textBox2_Validated);
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem2});
this.menuItem1.Text = "Menu 1";
//
// menuItem2
//
this.menuItem2.Index = 0;
this.menuItem2.Text = "Menu Item 1";
this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void textBox1_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validated");
}

private void textBox1_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validating");
}

private void textBox2_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validated");
}

private void textBox2_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validating");
}

private void menuItem2_Click(object sender, System.EventArgs e)
{
this.Validate();
}
}
}
 
I'm assuming that 'this' refers to the Form containing the UserControl
Try calling Validate on your UserControl instead
(i.e. something like this.myUsercontrol.Validate())

/claes

bob said:
Claes,
To simplify my question I used text box control as an example. In
reality I have a UserControl class that has a few text boxes. The
control is on a form which also has a menu control. I tried to apply
your suggestion (this.Validate) to my scenario and it didn't work (?).

Regards,
Bob



"Claes Bergefall" <[email protected]> wrote in message
It works for me

Are you sure you're handling the Validated event?
(the Validating event will also work)

Are you using the correct instance when you're calling
Validate. It must be the the form that contains your textbox

I've included a sample for you at the end of this post

/claes

bob said:
Thanks for suggestion, but it didn't work. According to help
ContainerControl.Validate should raise validate for each child control
that needs to be validated. I clicked on the text field, then clicked
on the menu where I have following code:

this.Validate();

Nothing happened... I still don't understand why Leave event occur
only within ContainerControl and doesn't get propagated up to the
form/window level.

Thanks,
Bob


****************** Sample ******************

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace ValidateTest
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(80, 56);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 0;
this.textBox1.Text = "";
this.textBox1.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox1_Validating);
this.textBox1.Validated += new
System.EventHandler(this.textBox1_Validated);
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(80, 96);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 1;
this.textBox2.Text = "";
this.textBox2.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox2_Validating);
this.textBox2.Validated += new
System.EventHandler(this.textBox2_Validated);
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem2});
this.menuItem1.Text = "Menu 1";
//
// menuItem2
//
this.menuItem2.Index = 0;
this.menuItem2.Text = "Menu Item 1";
this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void textBox1_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validated");
}

private void textBox1_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validating");
}

private void textBox2_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validated");
}

private void textBox2_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validating");
}

private void menuItem2_Click(object sender, System.EventArgs e)
{
this.Validate();
}
}
}
 
Thanks Claes. This does work.



Claes Bergefall said:
I'm assuming that 'this' refers to the Form containing the UserControl
Try calling Validate on your UserControl instead
(i.e. something like this.myUsercontrol.Validate())

/claes

bob said:
Claes,
To simplify my question I used text box control as an example. In
reality I have a UserControl class that has a few text boxes. The
control is on a form which also has a menu control. I tried to apply
your suggestion (this.Validate) to my scenario and it didn't work (?).

Regards,
Bob



"Claes Bergefall" <[email protected]> wrote in message
It works for me

Are you sure you're handling the Validated event?
(the Validating event will also work)

Are you using the correct instance when you're calling
Validate. It must be the the form that contains your textbox

I've included a sample for you at the end of this post

/claes

Thanks for suggestion, but it didn't work. According to help
ContainerControl.Validate should raise validate for each child control
that needs to be validated. I clicked on the text field, then clicked
on the menu where I have following code:

this.Validate();

Nothing happened... I still don't understand why Leave event occur
only within ContainerControl and doesn't get propagated up to the
form/window level.

Thanks,
Bob




****************** Sample ******************

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace ValidateTest
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
} base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(80, 56);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 0;
this.textBox1.Text = "";
this.textBox1.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox1_Validating);
this.textBox1.Validated += new
System.EventHandler(this.textBox1_Validated);
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(80, 96);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 1;
this.textBox2.Text = "";
this.textBox2.Validating += new
System.ComponentModel.CancelEventHandler(this.textBox2_Validating);
this.textBox2.Validated += new
System.EventHandler(this.textBox2_Validated);
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem2});
this.menuItem1.Text = "Menu 1";
//
// menuItem2
//
this.menuItem2.Index = 0;
this.menuItem2.Text = "Menu Item 1";
this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void textBox1_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validated");
}

private void textBox1_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox1_Validating");
}

private void textBox2_Validated(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validated");
}

private void textBox2_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
System.Diagnostics.Debug.WriteLine("textBox2_Validating");
}

private void menuItem2_Click(object sender, System.EventArgs e)
{
this.Validate();
}
}
}
 
Back
Top