2011-05-29 45 views
1

也许我在这里做了一个错误的假设,但这让我很难过。 我必须在同一个控件的两个不同位置设置两个相同的中继器。我想避免更改控件的名称,以便我可以在前端使用相同的功能(实际上,如果有更好的方式在直接复制和粘贴之外的两个不同位置使用两个相同的中继器,那将是大)。但是,为了简单起见,我已经打破两个如下:重复中继器,相同的UpdatePanels

<asp:Repeater ID="rptTest" runat="server"> 
    <ItemTemplate> 
     <asp:UpdatePanel runat="server" ID="updTestPanel"> 
      <ContentTemplate> 
       <asp:TextBox ID="txtTest" runat="server" /> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
     <asp:TextBox ID="txtTest2" runat="server" /> 
    </ItemTemplate> 
</asp:Repeater> 

<asp:Repeater ID="rptTest2" runat="server"> 
    <ItemTemplate> 
     <asp:UpdatePanel runat="server" ID="updTestPanel"> 
      <ContentTemplate> 
       <asp:TextBox ID="txtTest" runat="server" /> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
     <asp:TextBox ID="txtTest2" runat="server" />        
    </ItemTemplate> 
</asp:Repeater> 

事情是这样的:txtTest2是罚款在两个中继器被重复,但txtTest将引发以下错误:

错误4 'txtTest'已经在这个类中声明为'Protected WithEvents txtTest As System.Web.UI.WebControls.TextBox'。

错误5'私人重载函数__BuildControltxtTest()由于System.Web.UI.WebControls.TextBox'具有多个具有相同签名的定义。

错误8'txtTest'已在此类中声明为'Protected WithEvents txtTest As System.Web.UI.WebControls.TextBox'。

有没有办法做我想做的事情,还是我需要重新思考我在中继器中如何调用异步数据?

回答

0

不知道你想做什么太多,你有的方法将工作 - 但你不能在页面上有两个同名的控件。他们都在'页面'范围内,因此会抱怨。

我建议的是让方法对于中继器内的每个文本框都有所不同,但让他们调用不同的方法。在这些方法中,您可以将texbox值传递给实际完成工作的集中式方法。这样,您就不必重复代码,你正在做的是使两种不同的功能是在通贯穿线到您的集中方法..

+0

我想我不清楚的是,对于控制txtTest2,范围似乎是中继器,但对于txtTest,它回到了页面级别,即使它在中继器内 - 也仅在UpdatePanel内。什么是UpdatePanels,使控制范围返回页面级? – sixtimes 2011-05-29 06:07:19

+0

updatepanels最终被浏览器解释为'div',并且它只是通过名称来识别div,所以DOM可以重绘它。对于中继器,我相信'是相同的(由div标识),所以一旦输出,就没有真正的'范围'将它们分开...... – 2011-05-29 14:24:50

+0

Updatepanels也有不同的方式来引用它里面的字段,因为DOM需要引用它....你没有收到txtTest2字段的错误? – 2011-05-29 14:26:31

0

如果你是DataBoundRepeaterDataList控制, FormVeiw等),并在updatepanel下,这些控件将具有页级作用域。你必须给他们唯一的ID,因为我认为这个问题还没有另外的解决方法。 如果您注意到这些控件在页面上可用,而不使用FindControl。