How to disable event handler from its execution
-
Hi I am having button on form in C#. It does take 2-3 seconds to complete the operation meanwhile the button is disabled. But if the user clicks on that button when it is disabled, after completion of first operation it will again try to execute the handler again. how should I avoid the execution of event handler when the button is disabled? here is the code snippet: public partial class Form1 : Form { int i = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; System.Threading.Thread.Sleep(3000); i++; this.label1.Text = "Total Calls: " + i.ToString(); this.button1.Enabled = true; } } when the button is disabled and you click on it, you can see the count gets increased. Please help
-
Hi I am having button on form in C#. It does take 2-3 seconds to complete the operation meanwhile the button is disabled. But if the user clicks on that button when it is disabled, after completion of first operation it will again try to execute the handler again. how should I avoid the execution of event handler when the button is disabled? here is the code snippet: public partial class Form1 : Form { int i = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; System.Threading.Thread.Sleep(3000); i++; this.label1.Text = "Total Calls: " + i.ToString(); this.button1.Enabled = true; } } when the button is disabled and you click on it, you can see the count gets increased. Please help
You can unbind the click event at the time of disabling the button. Try following code.. button1.Click -= new System.EventHandler(this.button1_Click); And you can rebind the click even on making it enable. button1.Click += new System.EventHandler(this.button1_Click); Hope this will help!
Jinal Desai - LIVE Experience is mother of sage....
-
You can unbind the click event at the time of disabling the button. Try following code.. button1.Click -= new System.EventHandler(this.button1_Click); And you can rebind the click even on making it enable. button1.Click += new System.EventHandler(this.button1_Click); Hope this will help!
Jinal Desai - LIVE Experience is mother of sage....
Tried but no success still the same behavior The event handler now looks like this: private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; this.button1.Click -= new System.EventHandler(this.button1_Click); System.Threading.Thread.Sleep(3000); i++; this.label1.Text = "Total Calls: " + i.ToString(); this.button1.Enabled = true; this.button1.Click += new System.EventHandler(this.button1_Click); } still count is increasing if I click disabled button
-
Hi I am having button on form in C#. It does take 2-3 seconds to complete the operation meanwhile the button is disabled. But if the user clicks on that button when it is disabled, after completion of first operation it will again try to execute the handler again. how should I avoid the execution of event handler when the button is disabled? here is the code snippet: public partial class Form1 : Form { int i = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; System.Threading.Thread.Sleep(3000); i++; this.label1.Text = "Total Calls: " + i.ToString(); this.button1.Enabled = true; } } when the button is disabled and you click on it, you can see the count gets increased. Please help
Add an
if ( this.button1.Enabled )
? -
Add an
if ( this.button1.Enabled )
?Tried that also. The problem is that the event handler is getting called after first execution and at the end of it I am setting this.button1.Enabled = true; so this is not going to solve my problem..
-
Tried that also. The problem is that the event handler is getting called after first execution and at the end of it I am setting this.button1.Enabled = true; so this is not going to solve my problem..
Are you only clicking the button once? Have you attached the handler more than once?
-
Are you only clicking the button once? Have you attached the handler more than once?
I have not attached the handler more than once. After first click the button is disabled for 3 seconds when I click on the disabled button somewhere it is queuing that event and after execution of first event handler it is calling that event handler again that I don't want as I clicked on disabled button. I don't know how to attach the file here. PM provide me your email id I'll send you the test application I created to reproduce the problem.
-
Hi I am having button on form in C#. It does take 2-3 seconds to complete the operation meanwhile the button is disabled. But if the user clicks on that button when it is disabled, after completion of first operation it will again try to execute the handler again. how should I avoid the execution of event handler when the button is disabled? here is the code snippet: public partial class Form1 : Form { int i = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; System.Threading.Thread.Sleep(3000); i++; this.label1.Text = "Total Calls: " + i.ToString(); this.button1.Enabled = true; } } when the button is disabled and you click on it, you can see the count gets increased. Please help
Hi, it does not work like that. Those Enabled changes will take effect only after your handler finishes, and putting a
Thread.Sleep
in a handler is a big no no. A handler should never last more than some 10 milliseconds, your app's GUI should remain responsive at all times. What you need is either another thread (assuming the Sleep is emulating some real action), or a timer (assuming you really just want a delay). For timers, your best bet would be a System.Windows.Forms.Timer; you disable the button and launch the timer inside the button click handler, then re-enable the button and stop the timer inside the timer's tick handler. Works like a charm, without blocking anything but the button itself. :)Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
-
Hi, it does not work like that. Those Enabled changes will take effect only after your handler finishes, and putting a
Thread.Sleep
in a handler is a big no no. A handler should never last more than some 10 milliseconds, your app's GUI should remain responsive at all times. What you need is either another thread (assuming the Sleep is emulating some real action), or a timer (assuming you really just want a delay). For timers, your best bet would be a System.Windows.Forms.Timer; you disable the button and launch the timer inside the button click handler, then re-enable the button and stop the timer inside the timer's tick handler. Works like a charm, without blocking anything but the button itself. :)Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
Luc Pattyn wrote:
Those Enabled changes will take effect only after your handler finishes
Does this only apply to the Enabled property of controls, or others as well, and why wait until the handler completes? I've been seeing a different behavior for something like the ComobBox.SelectedIndex property. I have an app that, when you click a button, sets some ComboBox selections, does some processing, and maybe changes the ComboBox selection again (to indicate to the user that something is actually going on). This is all happenning in a function called by my button handler on the GUI thread, and I see the ComboBox values update while it runs. Yes, I know the fact that such a long procedure occurs in the click handler isn't the best solution (it was fine with the original program design, but we're in the process of moving this all out to a separate thread). Thanks, Dybs
The shout of progress is not "Eureka!" it's "Strange... that's not what i expected". - peterchen
-
Hi I am having button on form in C#. It does take 2-3 seconds to complete the operation meanwhile the button is disabled. But if the user clicks on that button when it is disabled, after completion of first operation it will again try to execute the handler again. how should I avoid the execution of event handler when the button is disabled? here is the code snippet: public partial class Form1 : Form { int i = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; System.Threading.Thread.Sleep(3000); i++; this.label1.Text = "Total Calls: " + i.ToString(); this.button1.Enabled = true; } } when the button is disabled and you click on it, you can see the count gets increased. Please help
How about using a flag in order to suppres the event?
private bool suppresEvent = false;
private void button1_Click(object sender, EventArgs e)
{
if(suppresEvent)
return;suppresEvent = true;
// do your hard work here
System.Threading.Thread.Sleep(3000);suppresEvent = false;
}I have no smart signature yet...
-
Luc Pattyn wrote:
Those Enabled changes will take effect only after your handler finishes
Does this only apply to the Enabled property of controls, or others as well, and why wait until the handler completes? I've been seeing a different behavior for something like the ComobBox.SelectedIndex property. I have an app that, when you click a button, sets some ComboBox selections, does some processing, and maybe changes the ComboBox selection again (to indicate to the user that something is actually going on). This is all happenning in a function called by my button handler on the GUI thread, and I see the ComboBox values update while it runs. Yes, I know the fact that such a long procedure occurs in the click handler isn't the best solution (it was fine with the original program design, but we're in the process of moving this all out to a separate thread). Thanks, Dybs
The shout of progress is not "Eureka!" it's "Strange... that's not what i expected". - peterchen
dybs wrote:
Does this only apply to the Enabled property of controls
I don't know; I don;t think it is documented, and I don't need to know as I keep my handlers short. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).