How to access control in template before control.Loaded

2 posts, 0 answers
  1. Mikkel
    Mikkel avatar
    58 posts
    Member since:
    Aug 2012

    Posted 10 Nov 2011 Link to this post

    Hi there,

    I have a RadDataForm with a template, which contains a TabControl and some controls on each TabPage. On two of the TabPages I have a GridView that I would like to populate as soon as the RadDataForm has loaded.

    The Loaded event on the GridViews are not fired until the TabPage is clicked, which means that I cannot get a reference to the GridView control, before the TabPage is clicked.

    How do I get a reference to the GridViews in order to populate them, before clicking the TabPage?

    Thanks in advance!
  2. Mikkel
    Mikkel avatar
    58 posts
    Member since:
    Aug 2012

    Posted 10 Nov 2011 Link to this post

    I found a better way of accessing the controls in the TabPages - here is how I did it.

    Set the Loaded event on the TabControl (<telerik:RadTabControl Loaded="RadTabControl_Loaded" >) and in that event handler, assign the TabControl to a RadTabControl attribute in code behind like so:

    RadTabControl _tabControl;
      
    void RadTabControl_Loaded(object sender, RoutedEventArgs e)
    {
        _tabControl = sender as RadTabControl;
    }

    Then you have access to the TabItems AND the controls in their respective contents. From here it is simple enough to get the controls you need - I wrote a small generic extension method for getting the control I need based on the type and name (if any) of the control:

    public static object GetTabPageItem(this RadTabControl tabControl, Type t, string name = "")
    {
        foreach(RadTabItem tabItem in tabControl.Items.Where(ti => ((RadTabItem)ti).Content.GetType() == t))
        {
            if(name != "")
            {
                var p = tabItem.Content.GetType().GetProperty("Name");
                if(p == null)
                {
                    continue;
                }
                string pName = (string)p.GetValue(tabItem.Content, null);
                if(pName != name)
                {
                    continue;
                }
            }
            return tabItem.Content;
        }
        return null;
    }


    Then I added easy access to the controls, by implementing properties for each control:

    UserAccounts UserAccountsView
    {
        get
        {
            if(_tabControl == null)
                return null;
            return (UserAccounts)_tabControl.GetTabPageItem(typeof(UserAccounts));
        }
    }
    UserRoles UserRolesView
    {
        get
        {
            if(_tabControl == null)
                return null;
            return (UserRoles)_tabControl.GetTabPageItem(typeof(UserRoles));
        }
    }

    And finally I was able to do the following on CurrentItemChanged:

    void RadDataForm_CurrentItemChanged(object sender, EventArgs e)
    {
        var user = RadDataForm.CurrentItem as Web.Models.User;
        UserAccountsView.LoadData(user.Id);
        UserRolesView.LoadData(user.Id);
    }

    Just thought I'd share that if someone else runs into the same problem.

    This approach will probably work for all types of container controls - not only TabControls. The priciple is simple - when the Loaded event of the container fires, assign the container control to a variable that you can use to get access to controls in the container.

  3. DevCraft banner
Back to Top