访问 asp.net 转发器中的文本框
Access textbox within asp.net 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>
当我提交按钮时,我想检索教科书中的内容 "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");
}
}
}
上面的代码片段来自按钮回调"Add_Comment",repeaterNote 是我的顶级Repeater id。它似乎具有正确数量的 RepeaterItems,但 DataItem 属性 始终为空。我添加了一个内部 foreach 循环来迭代我的嵌套转发器。同样,这正确地标识了只有一个顶级转发器具有嵌套转发器元素,但 DataItem 仍然为空。
关于如何从每个复读机的教科书中访问内容有什么建议吗?
我认为你的问题是你在你的 Page_Load()
方法中执行绑定机制而没有测试 if (!IsPostback)
这就是你找不到你想要的结果的原因。不要忘记设置 EnableViewState="False"
因此,如果您在 aspx 页面中或在您的页面加载
中添加,您应该在 Page_LoadComplete()
方法中移动您的绑定机制
if(!IsPostback)
{
//your binding mecanism
}
我认为不应在按钮中设置 OnCommand,而应将转发器中的 OnItemCommand 设置为事件处理程序,并将按钮中的 CommandName 属性 设置为易于识别的字符串。然后在转发器的 OnItemCommand 事件处理程序中,您在 e.CommandName 上执行 Select Case,如果您设置的是该按钮的 CommandName,则可以使用 e.Item.FindControl("notecommenttext") 来获取您的文本框控件。然后得到它的内容。当控件位于转发器中时,其 ID 会附加一堆内容,因此很难在转发器事件(如 ItemCommand)之外找到它。
我有一个嵌套的 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");
}
}
}
上面的代码片段来自按钮回调"Add_Comment",repeaterNote 是我的顶级Repeater id。它似乎具有正确数量的 RepeaterItems,但 DataItem 属性 始终为空。我添加了一个内部 foreach 循环来迭代我的嵌套转发器。同样,这正确地标识了只有一个顶级转发器具有嵌套转发器元素,但 DataItem 仍然为空。
关于如何从每个复读机的教科书中访问内容有什么建议吗?
我认为你的问题是你在你的 Page_Load()
方法中执行绑定机制而没有测试 if (!IsPostback)
这就是你找不到你想要的结果的原因。不要忘记设置 EnableViewState="False"
因此,如果您在 aspx 页面中或在您的页面加载
Page_LoadComplete()
方法中移动您的绑定机制
if(!IsPostback)
{
//your binding mecanism
}
我认为不应在按钮中设置 OnCommand,而应将转发器中的 OnItemCommand 设置为事件处理程序,并将按钮中的 CommandName 属性 设置为易于识别的字符串。然后在转发器的 OnItemCommand 事件处理程序中,您在 e.CommandName 上执行 Select Case,如果您设置的是该按钮的 CommandName,则可以使用 e.Item.FindControl("notecommenttext") 来获取您的文本框控件。然后得到它的内容。当控件位于转发器中时,其 ID 会附加一堆内容,因此很难在转发器事件(如 ItemCommand)之外找到它。