Dave Ludwig
Dave Ludwig

Reputation: 460

C# Preventing clicks on a form without using Enabled=false

I have a form that requires a long operation (expansion of a treeview node searches the network for additional items to create more tree nodes) - so I plan on using a BackgroundWorker for this task. During the long operation I want the cursor to be the wait cursor and I want the entire form to be unclickable except for the Cancel button. I know I could use Enabled=false but this turns the treeview grey which looks pretty lame imo.

I could just NOT use a BW but that means I have to use DoEvents to get the cursor to change and that possibly "Not Responding" would show up, which I hate.

I thought of handling all the mouse click events and keyboard events so that they are cancelled if the BW is busy... so that is my current plan. I just wondered if I am missing something, if there is another way.

Thanks.

Upvotes: 3

Views: 1297

Answers (3)

Nivid Dholakia
Nivid Dholakia

Reputation: 5462

You could use Background worker and pop up another dialog with progressbar and that shows current progress and a cancel button. Where you can user

popup = new ProgressWindow();
popup.Owner=this;
popup.show();

And the cancel button will cancel the background worker. In this way your back form will not be clickable and popup will remain on top with cancel button.

Upvotes: 0

stuartd
stuartd

Reputation: 73293

You could use a Panel as an overlay over the form, wholly or partly transparent, which only propagates clicks when over the cancel button - similar to the way browsers simulate modal windows by 'graying' the background with an overlay.

When you are in processing mode, set the Z-Order of the mask to be in front of all other controls, and when that finishes set it behind them.

Upvotes: 0

psurikov
psurikov

Reputation: 3478

There is no easy way to do that. It is better to fix your treeview and use Enabled property. You can also show your progressbar in Modal dialog - that will block UI

Upvotes: 2

Related Questions