C# 从gridview的TemplateFields中动态创建的控件获取数据
我有一个网页,有一个gridview,它绑定到一个自定义对象列表,但也有一个动态创建的TemplateFields。这些字段是在Page_PreRender中创建的,可以是基于列表中对象的文本框或下拉列表。我在页面底部有一个按钮,按下时需要保存在动态对象中输入的所有数据。当我尝试查找动态控件时,我无法使用FindControl方法进行查找。它总是一片空白 如何检索用户输入/选择的数据 这是我的网格视图C# 从gridview的TemplateFields中动态创建的控件获取数据,c#,asp.net,.net,C#,Asp.net,.net,我有一个网页,有一个gridview,它绑定到一个自定义对象列表,但也有一个动态创建的TemplateFields。这些字段是在Page_PreRender中创建的,可以是基于列表中对象的文本框或下拉列表。我在页面底部有一个按钮,按下时需要保存在动态对象中输入的所有数据。当我尝试查找动态控件时,我无法使用FindControl方法进行查找。它总是一片空白 如何检索用户输入/选择的数据 这是我的网格视图 <div id="divSearchCriteriaGrid" runat="serve
<div id="divSearchCriteriaGrid" runat="server" class="padding-top-15">
<asp:GridView ID="gvSearchCriteria" runat="server" AutoGenerateColumns="False" OnRowDataBound="gvSearchCriteria_OnRowDataBound" GridLines="None">
<Columns>
<asp:BoundField DataField="SearchFieldId" Visible="False" />
<asp:TemplateField HeaderText="Search Field">
<ItemTemplate>
<asp:CheckBox ID="cbDisplay" runat="server" AutoPostBack="False" onclick="ToggleCriteriaControls(this)" />
</ItemTemplate>
<ItemStyle Width="25%" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Begin Criteria">
<ItemStyle Width="35%" />
</asp:TemplateField>
<asp:TemplateField HeaderText="End Criteria">
<ItemStyle Width="35%" />
</asp:TemplateField>
<asp:BoundField DataField="ControlTypeId" Visible="False" />
</Columns>
</asp:GridView>
</div>
这一切都很好,控件是通过复选框创建的。
下面是我的代码,用于尝试循环遍历gridview的每一行,以获取用户输入的无效数据
private void Save()
{
foreach (GridViewRow row in gvSearchCriteria.Rows)
{
CheckBox include = (CheckBox)row.FindControl("cbDisplay");
int id, controlTypeId;
string criteriaOne = string.Empty;
string criteriaTwo = string.Empty;
if (!include.Checked) continue;
id = int.Parse(row.Cells[0].Text);
if (controlTypeId == "1")
{
RadTextBox radTextBox = (RadTextBox) row.FindControl("txtBoxBegin");
if (radTextBox != null)
{
criteriaOne = radTextBox.Text;
}
radTextBox = (RadTextBox)row.FindControl("txtBoxEnd");
if (radTextBox != null)
{
criteriaTwo = radTextBox.Text;
}
}
else if(controlTypeId == "2")
{
RadComboBox radComboBox = (RadComboBox)row.FindControl(string.Format("cbo{0}Begin",id));
if (radComboBox != null)
{
criteriaOne = radComboBox.SelectedValue;
}
}
}
}
我试图使用FindControlId获取的radTextBox和radComboBox变量总是返回null。
单元格0每次都返回ok,Id正确。cbDisplay复选框始终返回该行是否被选中,而单元格4只获得ControlTypeId。我无法获取模板字段的值
非常感谢您的帮助。一旦我将BindData函数移到Page_Init而不是Page_PreRender,我就能够从动态控件获取信息
private void Save()
{
foreach (GridViewRow row in gvSearchCriteria.Rows)
{
CheckBox include = (CheckBox)row.FindControl("cbDisplay");
int id, controlTypeId;
string criteriaOne = string.Empty;
string criteriaTwo = string.Empty;
if (!include.Checked) continue;
id = int.Parse(row.Cells[0].Text);
if (controlTypeId == "1")
{
RadTextBox radTextBox = (RadTextBox) row.FindControl("txtBoxBegin");
if (radTextBox != null)
{
criteriaOne = radTextBox.Text;
}
radTextBox = (RadTextBox)row.FindControl("txtBoxEnd");
if (radTextBox != null)
{
criteriaTwo = radTextBox.Text;
}
}
else if(controlTypeId == "2")
{
RadComboBox radComboBox = (RadComboBox)row.FindControl(string.Format("cbo{0}Begin",id));
if (radComboBox != null)
{
criteriaOne = radComboBox.SelectedValue;
}
}
}
}