ASPxGridview и коллекция элементов управления

Допустим, у меня есть ASPxGridView, который использует несколько различных типов шаблонов, и каждый из этих шаблонов имеет ASPxButton на нем. У меня также есть некоторые кнопки, которых нет в ASPxGridView. Если я рекурсивно перебираю все элементы управления в коллекции элементов управления страниц и изменяю текст кнопки (или другое свойство) любого найденного ASPxButton, то все ASPxButton на странице будут изменены, кроме тех, что на ASPxGridView.

Почему ASPxButtons на ASPxGridView не изменились? Кнопки на шаблонах ASPxGridView не находятся в коллекции элементов управления ASPxGridViews?

Кажется, что мне придется в специальном случае ASPxGridViews найти кнопки на них.... Я не могу использовать методы FindTemplateControl, потому что я не буду знать идентификаторы. Как я могу это сделать?

Заранее спасибо!

Изменить 7 марта 2013 года:

Вот пример того, что я делаю (это вызывается в событии Load главной страницы, и оно работает для всех кнопок, кроме кнопок в шаблонах ASPxGridView... возможно, других шаблонов):

    /// <summary>
    /// http://stackru.com/questions/2632302/loop-through-all-the-user-controls-on-a-page
    /// </summary>
    /// <param name="controls">Page.Controls or some other control collection.</param>
 private void setUseSubmitBehavior(ControlCollection controls)
    {
        foreach (Control ctrl in controls)
        {
            if (ctrl is ASPxButton)
            {
                if ((ctrl as ASPxButton).ID != GlobalProperties.SubmitButtonID)
                    (ctrl as ASPxButton).UseSubmitBehavior = false;
            }
            else if (ctrl is Button)
            {
                if ((ctrl as Button).ID != GlobalProperties.SubmitButtonID)
                    (ctrl as Button).UseSubmitBehavior = false;
            }

            try
            {
                if (ctrl.Controls.Count > 0)
                    setUseSubmitBehavior(ctrl.Controls);
            }
            catch (Exception ex)
            {
                //Don't let the page fail here... just add a log and let it fail on the page that caused the error.
                MiscUtility.ExceptionLog(Page.GetType().AssemblyQualifiedName + " - " + MethodInfo.GetCurrentMethod().Name, ex.Message, "");
            }
        }
    }

И вот пример моей первой попытки вызвать это на шаблонных кнопках GridViews... Но это не сработало:

 private void setUseSubmitBehavior(ControlCollection controls)
    {
        foreach (Control ctrl in controls)
        {
            if (ctrl is ASPxButton)
            {
                if ((ctrl as ASPxButton).ID != GlobalProperties.SubmitButtonID)
                    (ctrl as ASPxButton).UseSubmitBehavior = false;
            }
            else if (ctrl is Button)
            {
                if ((ctrl as Button).ID != GlobalProperties.SubmitButtonID)
                    (ctrl as Button).UseSubmitBehavior = false;
            }                
            else if (ctrl is DevExpress.Web.ASPxGridView.ASPxGridView)
            {
                setUseSubmitBehaviorOnASPxGridView((ctrl as ASPxGridView));
                continue;//This one is handled differently.
            }

            try
            {
                if (ctrl.Controls.Count > 0)
                    setUseSubmitBehavior(ctrl.Controls);
            }
            catch (Exception ex)
            {
                //Don't let the page fail here... just add a log and let it fail on the page that caused the error.
                MiscUtility.ExceptionLog(Page.GetType().AssemblyQualifiedName + " - " + MethodInfo.GetCurrentMethod().Name, ex.Message, "");
            }
        }
    }

    private void setUseSubmitBehaviorOnASPxGridView(ASPxGridView theGridView)
    {
        try
        {
            List<GridViewBaseTemplateContainer> listTemplateContainers = new List<GridViewBaseTemplateContainer>();

            if (theGridView.Templates.DataItem != null)
                listTemplateContainers.Add((theGridView.Templates.DataItem as GridViewDataItemTemplateContainer));
            if (theGridView.Templates.DataRow != null)
                listTemplateContainers.Add((theGridView.Templates.DataRow as GridViewDataRowTemplateContainer));
            if (theGridView.Templates.DetailRow != null)
                listTemplateContainers.Add((theGridView.Templates.DetailRow as GridViewDetailRowTemplateContainer));
            if (theGridView.Templates.EditForm != null)
                listTemplateContainers.Add((theGridView.Templates.EditForm as GridViewEditFormTemplateContainer));
            if (theGridView.Templates.EmptyDataRow != null)
                listTemplateContainers.Add((theGridView.Templates.EmptyDataRow as GridViewEmptyDataRowTemplateContainer));
            if (theGridView.Templates.FooterCell != null)
                listTemplateContainers.Add((theGridView.Templates.FooterCell as GridViewFooterCellTemplateContainer));
            if (theGridView.Templates.FooterRow != null)
                listTemplateContainers.Add((theGridView.Templates.FooterRow as GridViewFooterRowTemplateContainer));
            if (theGridView.Templates.GroupRow != null)
                listTemplateContainers.Add((theGridView.Templates.GroupRow as GridViewGroupRowTemplateContainer));
            if (theGridView.Templates.GroupRowContent != null)
                listTemplateContainers.Add((theGridView.Templates.GroupRowContent as GridViewBaseTemplateContainer));
            if (theGridView.Templates.Header != null)
                listTemplateContainers.Add((theGridView.Templates.Header as GridViewHeaderTemplateContainer));
            if (theGridView.Templates.HeaderCaption != null)
                listTemplateContainers.Add((theGridView.Templates.HeaderCaption as GridViewBaseTemplateContainer));
            if (theGridView.Templates.PagerBar != null)
                listTemplateContainers.Add((theGridView.Templates.PagerBar as GridViewPagerBarTemplateContainer));
            if (theGridView.Templates.PreviewRow != null)
                listTemplateContainers.Add((theGridView.Templates.PreviewRow as GridViewPreviewRowTemplateContainer));
            if (theGridView.Templates.StatusBar != null)
                listTemplateContainers.Add((theGridView.Templates.StatusBar as GridViewStatusBarTemplateContainer));
            if (theGridView.Templates.TitlePanel != null)
                listTemplateContainers.Add((theGridView.Templates.TitlePanel as GridViewBaseTemplateContainer));

            foreach (GridViewBaseTemplateContainer container in listTemplateContainers)
            {
                //The problem with this and other attempts is that container is always null even if listTemplateContainers is populated.
                if (container != null)
                {
                    ControlCollection cc = container.Controls;
                    if (cc != null && cc.Count > 0)
                        setUseSubmitBehavior(cc);
                }
            }
        }
        catch (Exception ex)
        {
            //Don't let the page fail here... just add a log and let it fail on the page that caused the error.
            MiscUtility.ExceptionLog(Page.GetType().AssemblyQualifiedName + " - " + MethodInfo.GetCurrentMethod().Name, ex.Message, "");
        }
    }

Кстати, я думаю, причина того, что в первом методе отсутствуют кнопки в шаблонах ASPxGridView, заключается в том, что их функции InstantiateIn вызываются после события загрузки главной страницы. Я также попробовал событие preRender главной страницы, но InstantiateIn все еще вызывается после этого.

0 ответов

Другие вопросы по тегам