2011-12-01 34 views
0

我有一個程序,允許用戶使用幾個下拉菜單選擇一個主題和屬性,然後拉出符合這兩個條件的數據。在gridview中,很多templatefields使用文本框進行即時編輯(一個提交按鈕保存所有更改)以及一個綁定到參數的下拉列表模板。這一切都在工作,相當長一段時間。PostBack DataBind錯誤:「確保在調用DataBind之前將該控件添加到頁面中。」

然後,我們更改了表中的一些數據(保留所有相同的字段名稱),現在頁面在啓動時加載完全正常,但只要您在任何深入下拉列表中選擇了不同的內容,頁面就會失敗。我收到一條錯誤消息,說

"The DropDownList control 'TagDDL' does not have a naming container. Ensure that the control is added to the page before calling DataBind."

(TagDDL是gridview中templatefield的下拉列表)。如果我簡單地刪除這個模板域,我會在超鏈接域中得到一個類似的(雖然不同的)錯誤,但是刪除這個錯誤會給我一個綁定域帶來錯誤,所以顯然它不會與任何一個綁定在一起。

我的想法是它與postback的數據綁定的工作方式有關,因爲頁面最初加載完美,下拉列表中有'Enable PostBack',錯誤消息指向DataBind。有任何想法嗎?

是建立GridView中的SqlDataSource(留出的明細下拉菜單現在)

<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(); 

    } 
+0

這肯定得是回發/ DataBind已涉及把如果MasterDisplay.DataBind()。(Page.IsPostBack!);在Page_Load一旦運行 – ScottieB

+0

立即導致系統崩潰有你在你的代碼中加入了斷點? –

+1

在我實際上拉取綁定數據所需的數據之前,嘗試添加到DDL是一個簡單的錯誤。確定訣竅。 – ScottieB

回答

0

這是一個簡單的錯誤,試圖添加到DDL之前,我實際上已經拉動了綁定它所需的數據。改變事情的順序略有訣竅

0

我很高興你找到你的答案。我在加載運行時的UserControl(ascx)上遇到類似的問題。我也改變了我的數據源和相應的sql數據源。 (在我的情況下,我用實體模型替換了sql數據源。)

我發現我的一個控件會綁定到新數據源(通過後面的代碼),沒有問題。的代碼看起來如下:

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

然而,在相同的方法中,下一個代碼部分將當所述的DataBind()方法被調用失敗。的代碼看起來如下:

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

原來,當我除去在SqlDataSource對象現有ASCX標記,我無法刪除在下拉控件的屬性的DataSourceID參考。所以當我調用DataBind()方法時,綁定引擎檢查了控件的屬性,找到了名稱DataSourceID,並立即在UserControl的控制層次結構中查找它。當綁定引擎未能找到對象時,它拋出異常「DropDownList控件沒有命名容器...「

我承認,這個特殊的例外是有點誤導,因爲它實際上是混淆了粘結劑在其指示跟隨的數據源(後面的代碼,或在ASCX文件的標記)。

我希望這有助於一些觀點:)