цикл через элементы управления в форме всегда получает первый элемент управления

У меня есть веб-форма, которая динамически загружает в нее пользовательский веб-элемент управления. В пользовательском веб-элементе управления есть элемент управления повторителем, и веб-пользовательский элемент управления может динамически создаваться внутри себя столько раз, сколько необходимо, все они загружаются в заполнитель.

eg:

webusercontrol1
   repeater
   webusercontrol
      repeater
   webusercontrol
      repeater
      webusercontrol
         repeater

Когда я перебираю элементы управления внутри заполнителя, появляется только первый повторитель.

мой код выглядит следующим образом:

protected void cmdsave_Click(object sender, EventArgs e)
{
    foreach ( Control ctl in this.officephld.Controls )
    {
        if ( ctl.GetType().ToString() == "ASP.evalctl_ascx" )
        {
            foreach ( Control sctl in ctl.Controls )
            { GetRatingControl(sctl); }
        }
    }
    Response.Redirect("~/contractoreval.aspx?sc=1");
}
protected void GetRatingControl(Control item)
{
    Repeater rpt = (Repeater)item.FindControl("rptPts");
    foreach ( Control ctl in rpt.Controls )
    {
        if ( ctl.GetType().ToString() == "System.Web.UI.WebControls.RepeaterItem" )
        {
            RepeaterItem ri = (RepeaterItem)ctl;
            HiddenField pntid = (HiddenField)ri.FindControl("pntid");
            HiddenField catid = (HiddenField)ri.FindControl("catid");
            HiddenField rating = (HiddenField)ri.FindControl("rating");
            if ( pntid != null && catid != null )
            {
                AjaxControlToolkit.Rating rtg = (AjaxControlToolkit.Rating)ri.FindControl("pntrating");
                SQLConnectivity db = new SQLConnectivity();
                SqlParameter[] param = new SqlParameter[8];
                int iRetValue = 0;

                param[0] = db.MakeInputParameter("@eval_id", Convert.ToInt32(pntid.Value));
                param[1] = db.MakeInputParameter("@category_id", Convert.ToInt32(catid.Value));
                param[2] = db.MakeInputParameter("@organization_id", 1);
                param[3] = db.MakeInputParameter("@subcontractor_id", 1);
                param[4] = db.MakeInputParameter("@project_id", 1);
                param[5] = db.MakeInputParameter("@rating", Convert.ToInt32(rating.Value));
                param[6] = db.MakeInputParameter("@created_by", 1);
                param[7] = db.MakeInputParameter("@updated_by", 1);
                db.RunNonQueryProcedure("PerformanceSubcontractorEvalSave", param, ref iRetValue);
            }
        }
    }
}

ИЗМЕНИТЬ для ретранслятора, этот рейтинг скрытого поля устанавливается только для первого элемента управления повторением, ниже приведена моя разметка HTML:

<asp:Repeater ID="rptPts" runat="server" Visible="false" 
    onitemdatabound="rptPts_ItemDataBound">
    <HeaderTemplate></HeaderTemplate>
    <ItemTemplate>
        <div style="width:75%;float:left;padding-top:3px;height:20px;">
            <asp:Label runat="server" ID="Label1" Text='<%#DataBinder.Eval(Container.DataItem, "eval_description") %>' Font-Names="Arial" Font-Size="10px"></asp:Label>
        </div>
        <asp:HiddenField ID="catid" runat="server" />
        <asp:HiddenField ID="pntid" runat="server" />
        <asp:HiddenField ID="rating" runat="server" />
        <div style="width:20%;float:right;padding-top:3px;padding-bottom:3px;height:20px;">
            <cc1:Rating ID="pntrating" runat="server" FilledStarCssClass="filldStar" OnChanged="pntrating_Changed" EmptyStarCssClass="emptyStar" StarCssClass="filldStar" WaitingStarCssClass="savedStar" EnableViewState="true" AutoPostBack="false" BehaviorID="ratingControlBehavior">
            </cc1:Rating>
        </div>
        <div style="clear:both;"></div>
    </ItemTemplate>
    <FooterTemplate></FooterTemplate>
</asp:Repeater>

как я могу пройтись по различным уровням управления ретранслятором и получить элементы ретранслятора в рамках этой настройки?


person mattgcon    schedule 28.08.2011    source источник


Ответы (2)


Вы недостаточно глубоко разбираетесь в дочерних элементах управления.

Сначала измените эту строку

if ( ctl.GetType().ToString() == "System.Web.UI.WebControls.RepeaterItem" )

к этому

if ( ctl is RepeaterItem )

как то, что у вас есть некрасиво.

затем внесите изменения в GetRatingControl, чтобы он рекурсивно вызывал себя для каждого элемента управления, являющегося RepeaterItem.

person kmcc049    schedule 28.08.2011
comment
Я думал о том, чтобы сделать рекурсию, но я застрял на том, где выполнить рекурсию. - person mattgcon; 28.08.2011
comment
Хорошо, теперь это происходит внутри оператора IF в этом цикле или после него? - person mattgcon; 28.08.2011
comment
Я попытался добавить this.GetRatingControl(ctl); в операторе IF в конце, но я продолжаю получать один и тот же повторяющийся элемент. Если я передам ctl (который является повторяющимся элементом), он все равно не сработает. - person mattgcon; 28.08.2011
comment
Хорошо, все заработало, однако есть еще одна проблема: я пытаюсь получить скрытый элемент управления от ретранслятора, но на втором ретрансляторе управляю этим (рейтинг HiddenField = (HiddenField)ri.FindControl(rating); приближается к нулю. Почему бы что быть? - person mattgcon; 28.08.2011
comment
Я добавил правку в исходную публикацию, чтобы, возможно, помочь (она показывает мою разметку для повторителя в HTML - person mattgcon; 28.08.2011
comment
Извини, приятель, я иду спать, в Новой Зеландии поздно вечером воскресенья. Моей первой точкой исследования этой проблемы было бы то, что два других скрытых поля также становятся нулевыми? Поставьте точку останова и посмотрите на коллекцию элементов управления на первом и втором и посмотрите, что отличается. Я считаю, что непосредственное окно очень полезно при выполнении подобных вещей, поскольку вы можете достаточно легко просматривать различные элементы в контрольной коллекции и дочерних элементах. - person kmcc049; 28.08.2011
comment
np приятель рад быть полезным - person kmcc049; 29.08.2011

пожалуйста, проверьте этот вопрос и ответ.

Измените условие для проверки повторителя.

Рекурсивно проверять ListBox внутри страницы

person Ashley John    schedule 28.08.2011
comment
Я не понимаю, как этот вопрос и ответ действительно могут мне помочь, поскольку это не относится к моему вопросу. - person mattgcon; 28.08.2011
comment
@mattgcon. вы просто проверяете элемент управления в форме. Ссылка, которую я упомянул, проверяет список. вы проверяете повторитель. Тип управления просто другой. Логика, используемая в обоих примерах, одинакова. - person Ashley John; 28.08.2011