C# Access UserControl from main form

jetbet
jetbet used Ask the Experts™
on
I have a Form on my application that contains several UserControls.
Each user control contains several custom buttons that I have derived from the button class.

I am trying to get at a button from the UserControl where the name of both the Button and UserControl names are stored in a config (XML) file. If I hard code the control getting the button is easy.
I cannot work out how to get the UserControl itself.

parent is my main form and this is called from an instance of a class on the form.

private void RemoveUnwantedScenes(Boolean _isMain, string _thisScene, Viz_ability.VizCommands.VizCommand.VizLayer _layer, UserControl _control)
        {
            Viz_ability.VizCommands.VizCommand command;
            List<string> scenes;
            if (_isMain)
            {
                command = vizMain;
                scenes = mainScenes;
            }
            else
            {
                command = vizPreview;
                scenes = previewScenes;
            }

            UserControl control = null;

            for (int i = scenes.Count - 1; i > -1; i--)
            {
                string scene = scenes[i];
                XmlNodeList nodeList = xml_sceneDoc.SelectNodes("scenes/scene[name = '" + _thisScene + "']/shares/share[. = '" + scene + "']");
                if (nodeList.Count == 0)
                {

                    String userControlName = DataCenter.XMLUtilities.GetElementValue(xml_sceneDoc, "scenes/scene[name = '" + scene + "']/userControl");
                    if (!String.IsNullOrEmpty(userControlName))
                    {
                        control = (UserControl)(parent.Controls.Find(userControlName, false).FirstOrDefault());
                    }
                    
                    ClearScene(_isMain, scene, _layer);   //Remove pre existing scene
                    scenes.Remove(scene);

                    XmlNode resetButton = xml_sceneDoc.SelectSingleNode("scenes/scene[name = '" + scene + "']/resetButton");
                    if ((resetButton != null) && (control != null))
                    {
                        Control[] matches = control.Controls.Find(resetButton.InnerText, true);
                        if (matches.Length > 0 && matches[0] is MutexPreviewButton)
                        {
                            MutexPreviewButton btn = (MutexPreviewButton)matches[0];
                            btn.ResetButton();
                        }
                    }
                }
            }
        }

Open in new window


The following line is what does not work
 control = (UserControl)(parent.Controls.Find(userControlName, false).FirstOrDefault());

Open in new window

Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
High School Computer Science, Computer Applications, Digital Design, and Mathematics Teacher
Top Expert 2009
Commented:
You've pass "false" as the second parameter which means it will NOT recurse into container controls looking for a match.  As such, the call will only succeed if the UserControl is directly contained by the Form, and not if it is inside another container (such as a Panel).

Change it to "true" and see if that works better:
control = (UserControl)(parent.Controls.Find(userControlName, true).FirstOrDefault());

Open in new window

Author

Commented:
Yes that was it. I should have read further rather than relying on examples. Thanks a lot.

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial