Shazam
Shazam

Reputation: 81

c# Accessing WinForm control properties from another class

How does one access WinForm controls such as ProgressBar properties from another class?

Please see my code below. I know this might not be the best option to expose WinForm class and its members as public but I am trying to clear the concept at this point.

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void button1_Click(object sender, EventArgs e)
        {
            Class1 c = new Class1();
            c.loop();
        }

        public void PBSetup()
        {
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 100;
        }

        public void PBUpdate(int recno)

        {
            progressBar1.Value = Class1.recno;
        }
    }
}

namespace WindowsFormsApplication1
{
    class Class1
    {

        public static int recno;

        public void loop()
        {
            //How do I access Form1.PBSetup()??

            for (recno = 0; recno <= 100; recno++)
            {
                //How do I access Form1.PBUpdate(recno)??
            }
        }
    }
}

Upvotes: 2

Views: 2638

Answers (4)

aleroot
aleroot

Reputation: 72636

You can change the access modifiers of the progress bar from private to Internal or public , you can do this operation from properties pane .

Properties pane

Keep in mind that you have to pass to the second class the instance of the form and then you can change the value of the progress bar directly from the second class.

However is a tricky solution, the best should be keep the presentation layer implementation separated and work with an event.

Upvotes: 1

Dan
Dan

Reputation: 314

I do not recommend to use this method, for simple reason as mentioned here by one of the comments. But if you really want to access that form control, here is how:

1) Select that control and set its access modifier to internal. 2) Assume your form id is "Form1" and control id is "control1"

Inside your method:

Form1 form = (Form1)Application.OpenForms["Form1"];
// form.control1  should now be available.

Upvotes: 0

Anthony Pegram
Anthony Pegram

Reputation: 126804

You do not want your business logic (your class) interacting with your UI (your form). The business logic should be agnostic of the presentation layer.

If you want the form to respond to things that happen inside the class, you could consider exposing an Event inside the class that the form could subscribe to, much like it would subscribe to a button's click event. The class instance could fire off the event completely unaware of who might be listening, and any subscribers would be notified.

Upvotes: 3

JonH
JonH

Reputation: 33143

This looks like a big time code smell :). You would need an instance of Form1 inside of Class1 in order to PBUpdate. Something tells me what you are doing is just not right.

Explain what you are trying to do and we can help. Otherwise there is no way to access PBUpdate unless you either made it a static function where you could call it like Form1.PBUpdate() or you had an instance of Form1 within your class Class1

Upvotes: 1

Related Questions