我无法在ListView中获取动态创建的控件的输入值。在ListView中获取动态添加控件的值
这里是我的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处理程序我添加一个文本框或其他控件的占位符。控件类型取决于项目,但为了保持简单,我们假设它始终是文本框。控件的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);
}
}
该文本框被找到,但没有任何价值。这就像我刚刚在上一个块中的新文本框中写过的那样。如果我删除了前面的代码块,就没有发现任何文本框。
有人能帮我解决我在这里失踪的事吗?
谢谢。
谢谢你,Phaedrus,这工作!我从来没有读过关于在ItemCreated事件中创建控件的任何内容。我在这里移动了创建并删除了我的代码块,以便在按钮提交处理程序中重新创建控件。再次感谢。 – DahlinDev 2010-09-17 03:45:56