C# How to override Fom.Controls collection

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.
LVL 1
locdangAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

anarki_jimbelSenior DeveloperCommented:
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
yanochCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
anarki_jimbelSenior DeveloperCommented:
yanoch, how you override the Form. Controls so that it returns panel controls?
0
Cloud Class® Course: Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

locdangAuthor Commented:
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
yanochCommented:
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
yanochCommented:
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
yanochCommented:
Sorry, i forgot, you just can't override controls.add.
0
anarki_jimbelSenior DeveloperCommented:
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
yanochCommented:
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
locdangAuthor Commented:
Works perfectly, Thanks :)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.