【发布时间】:2011-04-13 11:13:47
【问题描述】:
我无法在 ListView 中获取动态创建的控件的输入值。
这是我的列表视图:
<asp:ListView ID="lvQuestions" runat="server" DataKeyNames="ProductQuestionId" onitemdatabound="lvQuestions_ItemDataBound">
<LayoutTemplate>
<table>
<tr runat="server" id="itemPlaceholder"></tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("Question") %></td>
<td>
<asp:PlaceHolder ID="plControl" runat="server" />
<asp:HiddenField ID="hfQuestionId" runat="server" />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" onclick="btnSubmit_Click" />
在我的 ItemDataBound 处理程序中,我将 TextBox 或其他控件添加到占位符。控件类型取决于项目,但为了简单起见,我们假设它始终是一个文本框。控件的 ID 也是动态的。
// create a textbox control
TextBox txtbx = new TextBox();
txtbx.ID = "txtQuestion_" + productQuestionId.ToString(); //productQuestionId is the datakey value of this ListViewItem
placeholder.Controls.Add(txtbx);
当用户点击按钮时,我需要能够获取他们填写的值。
在我的研究中,我发现由于页面生命周期,我需要首先重新创建动态添加的控件才能获取它们的值。
这是我在按钮处理程序中用于重新创建控件的内容:
foreach (ListViewDataItem item in lvQuestions.Items)
{
HiddenField hdField = (HiddenField)item.FindControl("hfQuestionId");
PlaceHolder plcHolder = (PlaceHolder)item.FindControl("plControl");
TextBox txtbx = new TextBox();
txtbx.ID = "txtQuestion_" + hdField.Value;
plcHolder.Controls.Add(txtbx);
}
然后在同一个处理程序中的下一个代码块我重新遍历 ListViewDataItems 并找到控件:
foreach (ListViewDataItem item in lvQuestions.Items)
{
HiddenField hdField = (HiddenField)item.FindControl("hfQuestionId");
PlaceHolder plcHolder = (PlaceHolder)item.FindControl("plControl");
TextBox txtbx = (TextBox)plcHolder.FindControl("txtQuestion_" + hdField.Value);
if (txtbx != null)
{
Response.Write("TextBox Found:" + txtbx.Text);
}
}
找到文本框,但没有值。就像我刚刚在前一个块中用新的文本框覆盖了文本框。如果我删除前面的代码块,则找不到任何文本框。
有人可以帮我解决我在这里缺少的东西吗?
谢谢。
【问题讨论】:
标签: asp.net listview dynamic controls