我無法在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