【问题标题】:Access textbox within asp.net repeater在 asp.net 中继器中访问文本框
【发布时间】:2015-03-06 22:12:47
【问题描述】:

我有一个嵌套的 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>

当我提交按钮时,我想检索教科书“notecommenttext”中的内容。似乎没有一种简单的方法可以做到这一点。我曾尝试将教科书的 ID 设置为唯一的“NoteID”,但似乎无法做到。

    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");
            }
        }
    }

上面的sn-p来自按钮回调“Add_Comment”,repeaterNote是我的顶级Repeater id。它似乎具有正确数量的 RepeaterItem,但 DataItem 属性始终为空。我添加了一个内部 foreach 循环来迭代我的嵌套中继器。同样,这正确地识别出只有一个顶级转发器具有嵌套转发器元素,但 DataItem 仍然为空。

关于如何从每个复读机的教科书中访问内容有什么建议吗?

【问题讨论】:

  • 通常数据在您重新绑定之前在服务器上不可用。您必须根据您拥有的 id 重新加载数据。
  • 你能扩展一下吗?我在 page_load 中设置数据源并调用数据库。我应该在按钮回调中再次调用 DataBind 吗?
  • 你是一直设置在page_load,还是只在不是回发的时候设置?您必须设置数据并每次调用 DataBind 才能从该属性中获得数据。
  • 目前只在非回发时设置。我刚刚尝试删除该检查,但不幸的是它仍然返回 DataItem 为 null。
  • @Tomsmith 您是否尝试过我在回答和评论中提出的建议?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @汤姆史密斯。看看这个 anwser 。如果它不起作用,请将foreach(RepeaterItem noteItem in repeaterNote.Items) 循环更改为for(int i=0;i&lt;repeaterNote.Items.Count;i++) 循环
    • 我在 Page_Load() 中进行绑定,它也在检查 !IsPostBack 中。应该在哪个控件上设置 EnabledViewState?正在找到这些项目,因此 for each 和 for 循环都以相同的方式工作。只是项目的值为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多