Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I read a property from my main form in a user control

I have written a user control, MenuItem, which inherits from a Form Label.

I have a backgroundworker thread whose IsBusy property is exposed through a property in the MainForm as IsBackgroundBusy.

How do I read this property from the MenuItem usercontrol? I am currently using Application.UseWaitCursor and I set that in the backgroundworker and it works perfectly, however I do not want the cursor to change. That's why I figured a property that I could set would be much better.

Here is the code in my MainForm:

public partial class MainForm : Form
{
    public bool IsBackgroundBusy
    {
        get
        {
            return bwRefreshGalleries.IsBusy;
        }
    }

Here is the code for my usercontrol:

public partial class MenuItem: Label
{
    private bool _disableIfBusy = false;

    [Description("Change color if Application.UseWaitCursor is True")]
    public bool DisableIfBusy
    {
        get
        {
            return _disableIfBusy;
        }

        set
        {
            _disableIfBusy = value;
        }
    }

    public MenuItem()
    {
        InitializeComponent();
    }

    protected override void OnMouseEnter( EventArgs e )
    {
        if ( Application.UseWaitCursor && _disableIfBusy )
        {
            this.BackColor = SystemColors.ControlDark;
        }
        else
        {
            this.BackColor = SystemColors.Control;
        }

        base.OnMouseEnter( e );
    }
like image 455
RoadRacer524 Avatar asked Nov 09 '22 20:11

RoadRacer524


1 Answers

(Note: it's not clear to me whether you have an actual UserControl here or not. The MenuItem class you show inherits Label, not UserControl. You should probably avoid using the term "usercontrol" or "user control" when you are not actually dealing with a UserControl object).

Absent a complete code example, it's hard to know exactly what the right solution here is. However, assuming you are using the BackgroundWorker in a typical fashion, then you simply need for the owner of the control (i.e. the containing Form) to pass the necessary state to the control as it changes. E.g.:

class MenuItem : Label
{
    public bool IsParentBusy { get; set; }
}

// I.e. some method where you are handling the BackgroundWorker
void button1_Click(object sender, EventArgs e)
{
    // ...some other initialization...

    bwRefreshGalleries.RunWorkerCompleted += (sender1, e1) =>
    {
        menuItem1.IsParentBusy = false;
    };

    menuItem1.ParentIsBusy = true;
    bwRefreshGalleries.RunAsync();
}

If you already have a handler for the RunWorkerCompleted event, then just put the statement to set the IsParentBusy property there instead of adding another handler.

Then instead of using the Application.UseWaitCursor property, you can just look at the IsParentBusy property.

There are other mechanisms you could use; I do agree with the general sentiment that the MenuItem control should not be tied to your specific Form sub-class. If for some reason the above doesn't work in your case, you need to elaborate on your question: provide a good code example and explain exactly why simply having the container of the control manage its state directly doesn't work for you

like image 84
Peter Duniho Avatar answered Nov 15 '22 05:11

Peter Duniho