Solved

C# How to override Fom.Controls collection

Posted on 2010-08-15
10
998 Views
Last Modified: 2013-12-17
Hi Everyone,

I have a custom form component I have written that has a docked panel in the form's body.

When an object is added to the Form.Controls collection it currently adds it to the same collection that contains the panel, what I want is when someone calls Form.Controls.Add(object) it adds the supplied object to the Panel's Controls collection.

I am aware that I could just write Form.Panel.Controls.Add but that defeats what i am trying to accomplish.

Thanks,

Xavier.
0
Comment
Question by:locdang
  • 5
  • 3
  • 2
10 Comments
 
LVL 29

Expert Comment

by:anarki_jimbel
ID: 33443286
I'm not sure if it worth doing what you want to achieve. You may try doing something like overriding the Controls property. Really, you can't overide it, you may shadow it - see the snippet 1. In other words, you have to inherit from the Form class, e.g., MyForm class.

The reason why I added a delegate - this MyForm class has no idea about Panel 1 yet - so you may set the delegate after Panel is added. You may have a look at the snippet 2. MyForm1 class is a subclass of MyForm.

I didn't get it working - I believe, too much complexity and troubles. But this is one of possible ways.

Not sure why you need this but may I propose a simpler solution? OK, just add a "Add(Control ctrl)" method to your form class, and invoke in it :

this.Panel1.Controls(ctrl);
===snippet 1

    public class MyForm : System.Windows.Forms.Form

    {

        public delegate Control.ControlCollection getControlsCollectionDelegate(); 

        private getControlsCollectionDelegate controlsDelegate = null;



        public new Control.ControlCollection Controls 

        {

            get

            {



                if (controlsDelegate != null)

                {

                    Control.ControlCollection ctrls = controlsDelegate.Invoke();

                    return ctrls;

                }

                else

                {

                    return this.Controls;

                }

            }

        }



        public void setControlsDelegate(getControlsCollectionDelegate ctrlDelegate)

        {

            controlsDelegate = ctrlDelegate;

        }



        public MyForm() : base()

        {

        }



    }





// snippet 2



        public MyForm1()

        {



            MyForm.getControlsCollectionDelegate controlDelegate = new getControlsCollectionDelegate( getMyFormControls);

            this.setControlsDelegate(controlDelegate);

            InitializeComponent();

        }



        private System.Windows.Forms.Control.ControlCollection getMyFormControls()

        {

            return (System.Windows.Forms.Control.ControlCollection)this.panel1.Controls;

        }

Open in new window

0
 
LVL 3

Accepted Solution

by:
yanoch earned 500 total points
ID: 33443305
Hope this help
 public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

           

          

        }



        protected override Control.ControlCollection CreateControlsInstance()

        {



            return new CustomControlCollection(this);

        }





        public class CustomControlCollection : Control.ControlCollection

        {



            public CustomControlCollection(Control owner) : base(owner)

            {

            }



            public override void Add(System.Windows.Forms.Control value)

            {

                foreach (Control ctrl in this)

                    if (ctrl is Panel) // Panel should be replaced by your panel class type

                    {

                        ctrl.Controls.Add(value);

                        return;

                    }





                base.Add(value);

            }



            public override void Remove(System.Windows.Forms.Control value)

            {

                base.Remove(value);

            }

        }       



    }

Open in new window

0
 
LVL 29

Expert Comment

by:anarki_jimbel
ID: 33443335
yanoch, how you override the Form. Controls so that it returns panel controls?
0
 
LVL 1

Author Comment

by:locdang
ID: 33443342
I dont want to return / add panel controls, I want to override all Form.Controls.Add method involkes and add the control to the Panel's control collection rather than the Form's control collection.

Sorry for the misunderstanding. :)

Xavier.
0
 
LVL 3

Expert Comment

by:yanoch
ID: 33443354
Test my snippet, this is exactly what it is doing. If you have something of the type panel on the form and you call yourform.controls.add it will be added to the panel and not the form.
0
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 3

Expert Comment

by:yanoch
ID: 33443367
In fact, I replaced the current control collection by my custom contr collection to by able to get an hand on the controls.add
0
 
LVL 3

Expert Comment

by:yanoch
ID: 33443371
Sorry, i forgot, you just can't override controls.add.
0
 
LVL 29

Expert Comment

by:anarki_jimbel
ID: 33443412
Agree, "you just can't override controls.add".
Moreover, I understood really what you wanted but you do not understand consequences and implications of what you want to do. Try to think: if you add controls to the panel, how you add the panel to the form?! If you can't do that - you won't see any controls on the form. Also - you can't replace the Controls collection with any custom collection - it's "readonly" . And so on. So the only possible way is to override the form class but I'm noit 100 % sure it will be successful.
0
 
LVL 3

Expert Comment

by:yanoch
ID: 33443446
It is working. Try it. The panel is added to the form. And the controls are added to the panel. Look at the override Add method.
0
 
LVL 1

Author Closing Comment

by:locdang
ID: 33443454
Works perfectly, Thanks :)
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

In my previous two articles we discussed Binary Serialization (http://www.experts-exchange.com/A_4362.html) and XML Serialization (http://www.experts-exchange.com/A_4425.html). In this article we will try to know more about SOAP (Simple Object Acces…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
This video shows how to remove a single email address from the Outlook 2010 Auto Suggestion memory. NOTE: For Outlook 2016 and 2013 perform the exact same steps. Open a new email: Click the New email button in Outlook. Start typing the address: …

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now