访问asp.net转发器中的文本框

时间:2015-03-06 22:12:47

标签: c# asp.net repeater nested-repeater

我有一个嵌套的asp转发器,它正确显示我的所有项目。我在每个转发器的ItemTemplate中有另一个div,它将内容提交给我的代码。

<asp:Repeater runat="server" id="repeaterNote" OnItemDataBound="repeaterNote_ItemDataBound">
        <ItemTemplate>
            <div id="note" class="staff"><p><%# Eval("Content") %></p><ul>
                <li><%# Eval("AddedDate") %></li><li>20:29</li>
                <li><%# Eval("AddedByName") %></li><li>
                    <a href="#" onclick="showAddComment(addComment<%# Eval("NoteID") %>)" class="but">Add comment</a></li></ul>
                                <div id="addComment<%# Eval("NoteID") %>" class="staff" style="display:none">
                                <asp:TextBox ID="notecommenttext" runat="server" rows="4"> </asp:TextBox>
                                <asp:Button ID="Button" runat="server" Text="Add" CommandArgument='<%# Eval("NoteID") %>' OnCommand="Add_Comment" /> 
                                </div>
                            </div>

当我提交按钮时,我想要检索教科书中的内容&#34; notecommenttext&#34;。这似乎并不是一种简单的方法。我试图将教科书的ID设置为唯一的&#34; NoteID&#34;但似乎无法做到。

    string uniqueNoteID = e.CommandArgument.ToString();

    int parent = int.Parse(uniqueNoteID);

    TextBox txtName = new TextBox();

    foreach(RepeaterItem noteItem in repeaterNote.Items)
    {
        if (noteItem.ItemType == ListItemType.Item || noteItem.ItemType == ListItemType.AlternatingItem)
        {
            Notes rin = (Notes)noteItem.DataItem;
            if (rin.RelativeNoteId == parent)
            {
                txtName = (TextBox)noteItem.FindControl("notecommenttext");
            }
        }
    }

上面的代码段来自按钮回调&#34; Add_Comment&#34;,repeaterNote是我的顶级转发器ID。它似乎具有正确数量的RepeaterItems,但DataItem属性始终为null。我添加了一个内部foreach循环来迭代我的嵌套转发器。同样,这正确地标识了只有一个顶级转发器具有嵌套的转发器元素,但DataItem仍为空。

有关如何从每个中继器的教科书中访问内容的任何建议吗?

2 个答案:

答案 0 :(得分:0)

我认为您的问题是您正在使用Page_Load()方法进行绑定机制而不测试if (!IsPostback)这就是您找不到所需结果的原因。不要忘记设置EnableViewState="False" 因此,如果您在aspx页面中或添加页面加载,则应使用Page_LoadComplete()方法移动绑定机制

if(!IsPostback)
{
  //your binding mecanism
}

答案 1 :(得分:0)

我认为不是在按钮中设置OnCommand,而是应该在转发器中将OnItemCommand设置为事件处理程序,并将按钮中的CommandName属性设置为易于识别的字符串。然后在转发器的OnItemCommand事件处理程序中,您在e.CommandName上执行Select Case,如果它是您设置的那个按钮的CommandName,则可以使用e.Item.FindControl(“notecommenttext”)来获取文本框控件。然后得到它的内容。当控件在转发器中时,其ID会附加一堆内容,因此很难在ItemCommand之类的转发器事件之外找到它。