我有一个gridview,其中有多个列具有项目模板(从后面的代码添加)。列数将是动态的。项目模板可能包含多个条件的文本框。在我想要访问它时,在提交按钮的点击事件中,我无法访问它。
我添加模板的代码如下:
if (showBlankTextBox == true)
{
(c as LiteralControl).ID = "ltr_" + fieldName;
(c as LiteralControl).Text = "<label>" + targetValue + "</label>" +
"<br /> " +
"<input type='textbox' id='txt_" + fieldName + "' cols='10' runat='server' />";
// "<asp:TextBox ID='txt_" + fieldName + "' runat='server'></asp:TextBox>";
}
else
{
(c as LiteralControl).Text = "<label>" + targetValue + "</label>" +
"<br/> <div> <label>" + actualValue + "</label> </div>" +
"<div>" + percentResult + "</div>";
}
使用此代码后,我得到的GridView绝对是完美的
在上图中,红色方块区域是放在LiteralControl
内的文本框,为文本框生成的HTML是<input type="textbox" id="txt_9_Q" cols="10" runat="server">
(我从萤火虫检查了这个HTML)。
在提交按钮的点击事件中,我想访问文本框值,但我无法找到文本框控件。我访问文本框的代码如下:
protected void btnSubmit_Click(object sender, EventArgs e)
{
// getting data table from gridview
DataTable dt = (DataTable)grdKPI.DataSource;
string strActualValue = string.Empty;
foreach (GridViewRow gridRow in grdKPI.Rows)
{
LiteralControl txtQuarter = gridRow.Cells.Cast<TableCell>().FirstOrDefault(c => c.Controls.Cast<LiteralControl>().Any(ctrl => ctrl.GetType() == typeof(LiteralControl))).Controls.Cast<LiteralControl>().FirstOrDefault(ctr => ctr.GetType() == typeof(LiteralControl));
if (txtQuarter != null)
{
}
}
}
gridview的aspx代码如下:
<asp:GridView ID="grd1" runat="server" AutoGenerateColumns="false" >
<Columns>
<asp:BoundField DataField="Area" HeaderText="Area" />
<asp:BoundField DataField="Purpose" HeaderText="Purpose"/>
</Columns>
</asp:GridView>
但在txtQuarter
的text属性中,我没有看到文本框。
我错过了什么?