Ошибка PostBack DataBind: «Убедитесь, что элемент управления добавлен на страницу перед вызовом DataBind». - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть программа, которая позволяет пользователю использовать несколько раскрывающихся списков для выбора темы и атрибута, а затем извлекаются данные, соответствующие обоим этим условиям. В виде сетки многие поля шаблонов используют текстовые поля для мгновенного редактирования (кнопка отправки сохраняет все изменения), а также шаблон с раскрывающимся списком, привязанным к параметру. Все это работало безумно долго.

Затем мы изменили некоторые данные в таблицах (сохраняя все те же имена полей), и теперь страница загружается идеально при запуске, но затем, как только вы выбираете что-то другое в любом из раскрывающихся списков, страница перестает работать. Я получаю сообщение об ошибке

"Элемент управления DropDownList TagDDL не имеет контейнера именования. Убедитесь, что элемент управления добавлен на страницу перед вызовом DataBind. "

(TagDDL - это раскрывающийся список в поле шаблона в виде сетки). Если я просто удаляю это поле шаблона, я получаю аналогичную (хотя и другую) ошибку в поле гиперссылки, удаление этого дает мне ошибку в связанном поле, поэтому очевидно, что оно не привязано ни к одной вещи.

Моя идея заключается в том, что это как-то связано с тем, как привязка данных работает после обратной передачи, поскольку страница загружается идеально изначально, в раскрывающихся списках есть «Включить PostBack», а сообщения об ошибках относятся к DataBind. Есть идеи?

SqlDataSource, который создает Gridview (пока без раскрывающихся списков)

<asp:SqlDataSource ID="MasterTable" runat="server"
    ConnectionString="<%$ ConnectionStrings:spvConnectionString %>" 
    SelectCommand="exec pmtv2.maintable_display 1, @IPG_Assigned, @CompetitorName, @enterprise_zone, @Banner, @BrandName"
    <SelectParameters>
        <asp:ControlParameter ControlID="ChooseBanner" Name="Banner" PropertyName="SelectedValue" Type="String" />
        <asp:ControlParameter ControlID="ChooseIPGs" Name="IPG_Assigned" PropertyName="SelectedValue" Type="Int32" />
        <asp:ControlParameter ControlID="ChooseBrands" Name="BrandName" PropertyName="SelectedValue" Type="String" />
        <asp:ControlParameter ControlID="ChooseComps" Name="CompetitorName" PropertyName="SelectedValue" Type="String" />
        <asp:ControlParameter ControlID="ChooseZone" Name="enterprise_zone" PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>

 <div id="MasterDiv" style="width:90%">
        <asp:GridView ID="MasterDisplay" runat="server"
            AllowSorting="True" AutoGenerateColumns="False" 
            DataKeyNames="productKey,banner,enterprise_zone,userID" DataSourceID="MasterTable" 
            OnRowDataBound="MasterDisplay_RowDataBound"
            OnSorting="MasterDisplay_Sorting"
            class="mGrid" AlternatingRowStyle-CssClass="mGridAlt">

 </AlternatingRowStyle>
            <Columns>
                <asp:TemplateField HeaderText="Description" SortExpression="productdescriptionlong">
                     <ItemTemplate>
                           <a href="javascript:openPopup('JustinPractice4.aspx?UPC=<%#  Eval("UPC") %>    
&banner=<%# Eval("banner") %>&enterprise_zone=<%# Eval("enterprise_zone") %>')"><%# Eval("productdescriptionlong")%></a>
                     </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="BrandName" HeaderText="Brand" 
                    SortExpression="BrandName" />
                  <asp:TemplateField HeaderText="New Price" SortExpression="new_base_retail">
                    <ItemTemplate>
                        <asp:TextBox ID="RWNextPrice" runat="server" 
                            Text='<%# Bind("new_base_retail", "{0:N2}") %>' Width="60px"
                            class="calculate" onchange="lineItemRipple(this)"
                            Visible='<%# ShowBox %>'></asp:TextBox>
                        <asp:Label ID="RNextPrice" runat="server" Text='<%# Eval("new_base_retail", "{0:c}") %>'
                            Visible='<%# ShowLabel %>'></asp:Label>
                        <asp:HiddenField ID="lineCode" runat="server" Value='<%# Eval("line_code") %>'/>
                    </ItemTemplate>
                </asp:TemplateField>

                  <asp:ImageField DataImageURLField="unique_flags" HeaderText="Flags" 
                    DataImageURLFormatString="Media/Images/{0}.png" SortExpression="unique_flags"/>
                <asp:TemplateField HeaderText="Tag Type" SortExpression="tag_type">
                    <ItemTemplate>
                        <asp:DropDownList ID="TagDDL" runat="server"
                            DataSourceID="dimTags"
                            DataTextField="Tag_type_name"
                            DataValueField="Tag_type_name"
                            SelectedValue='<%#Bind("tag_type") %>'
                            visible='<%#ShowBox %>'>
                        </asp:DropDownList>
                        <asp:Label ID="TagR" runat="server"
                            Text='<%# Eval("tag_type") %>'
                            Visible='<%# ShowLabel %>' />
                    </ItemTemplate>
                </asp:TemplateField>
          </Columns>
</asp:GridView>
 <asp:Button ID="Commit" runat="server" Text="Commit Changes" OnClick="Commit_Click"
            class="button"/>

и соответствующий код:

protected void Page_Load(object sender, EventArgs e) {
        ErrorMsg.Text = "test45"; 
    }

protected void MasterDisplay_RowDataBound(object sender, GridViewRowEventArgs e) {
        DataSourceSelectArguments sr = new DataSourceSelectArguments();
        DataView dv = (DataView)CheckForCommit.Select(sr);
        if (dv.Count != 0) {
            CommittedOrNot.Text = dv[0][0].ToString();
        }
//pulling results from a SqlDataSource confirming presence of data

       //calculations to maintain a running tally of certain fields for later use
    }

protected void Commit_Click(Object sender, EventArgs e) {
        string tagValue = "FLAG";
        foreach (GridViewRow gvr in MasterDisplay.Rows) {
            tagValue = ((DropDownList)gvr.FindControl("TagDDL")).SelectedValue;
            MasterDisplay.UpdateRow(gvr.RowIndex, false);
        } //for every row, update it
        MasterDisplay.DataBind();

    }

Ответы [ 2 ]

0 голосов
/ 11 июля 2013

Я рад, что вы нашли свой ответ.У меня была похожая проблема с UserControl (ascx), который загружался во время выполнения.Я тоже внес изменения в свой источник данных и соответствующие источники данных sql.(В моем случае я заменял источники данных sql моделью сущностей.)

Я обнаружил, что один из моих элементов управления будет связываться с новым источником данных (с помощью кода ниже) без проблем.Код выглядел следующим образом:

gridSomeData.DataSource = controller.GetListOfAssociatedParts();
gridSomeData.DataBind();

Однако в том же методе следующий раздел кода потерпит неудачу при вызове метода DataBind ().Код выглядел следующим образом:

drpDataList.DataSource = controller.GetListOfParts();
drpDataList.DataTextField = "PartID"
drpDataList.DataValueField = "PartKey"
drpDataList.DataBind(); 

Оказалось, что когда я удалил предыдущую разметку ASCX для объектов SqlDataSource, мне не удалось удалить ссылку в атрибуте DataSourceID раскрывающегося элемента управления.Поэтому, когда я вызвал метод DataBind (), механизм привязки проверил атрибуты элемента управления, нашел имя DataSourceID и сразу же начал искать его в иерархии элементов управления UserControl.Когда механизм привязки не смог найти объект, он выдал исключение «Элемент управления DropDownList [...] не имеет контейнера именования ...»

Я признаю, что это конкретное исключение несколько вводит в заблуждение,поскольку в действительности перепутывается путаница из-за того, какие инструкции следует соблюдать для источника данных (код или разметка в файле ascx).

Надеюсь, это поможет с некоторой точки зрения.:)

0 голосов
/ 28 февраля 2012

Попытка добавить DDL была простой ошибкой, прежде чем я фактически извлек данные, необходимые для его привязки. Смена порядка вещей слегка сделала свое дело

...