Asp.net 网格视图模板字段数据持久化
Asp.net grid view template fields data persist
我有一个包含 4 个模板字段的网格视图,每个模板字段包含一个文本框。
现在我已经将这些模板字段与数据源绑定了。当我作为用户在文本框中输入一些数据并单击保存按钮(该按钮不是 gridview 的一部分,而是网络表单中的一个按钮)时,我无法在单击事件处理程序中获取值在代码隐藏文件中。请帮助我。
ASPX 文件
<asp:TemplateField HeaderText="col1">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt1" runat="server" Text='<%# Bind("[col1]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="col2">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt2" runat="server" Text='<%# Bind("[col2]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="col3">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt3" runat="server" Text='<%# Bind("[col3]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="col4">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt4" runat="server" Text='<%# Bind("[col4]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
文件背后的代码
protected void ButtonAdd_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in gvEdit.Rows)
{
string a = ((TextBox)row.FindControl("col1")).Text;
//above line gives a null value
}
}
您需要遍历 GridViewRowCollection
,然后针对每一行,通过您在标记中提供的 Id
找到控件。例如:
protected void ButtonAdd_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in gvEdit.Rows)
{
var txt1 = row.FindControl("txt1") as TextBox;
var txt2 = row.FindControl("txt2") as TextBox;
var txt3 = row.FindControl("txt3") as TextBox;
var txt4 = row.FindControl("txt4") as TextBox;
// access the Text property of each, e.g. txt1.Text
}
}
更新:确保当你进行数据源绑定时,它只发生在初始加载而不是后续回发,否则你的更改每次都会被重置。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GridView1.DataSource = // data source
GridView1.DataBind();
}
}
我有一个包含 4 个模板字段的网格视图,每个模板字段包含一个文本框。
现在我已经将这些模板字段与数据源绑定了。当我作为用户在文本框中输入一些数据并单击保存按钮(该按钮不是 gridview 的一部分,而是网络表单中的一个按钮)时,我无法在单击事件处理程序中获取值在代码隐藏文件中。请帮助我。
ASPX 文件
<asp:TemplateField HeaderText="col1">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt1" runat="server" Text='<%# Bind("[col1]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="col2">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt2" runat="server" Text='<%# Bind("[col2]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="col3">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt3" runat="server" Text='<%# Bind("[col3]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="col4">
<ControlStyle Height="25px" Width="60px" />
<ItemTemplate>
<asp:TextBox ID="txt4" runat="server" Text='<%# Bind("[col4]") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
文件背后的代码
protected void ButtonAdd_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in gvEdit.Rows)
{
string a = ((TextBox)row.FindControl("col1")).Text;
//above line gives a null value
}
}
您需要遍历 GridViewRowCollection
,然后针对每一行,通过您在标记中提供的 Id
找到控件。例如:
protected void ButtonAdd_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in gvEdit.Rows)
{
var txt1 = row.FindControl("txt1") as TextBox;
var txt2 = row.FindControl("txt2") as TextBox;
var txt3 = row.FindControl("txt3") as TextBox;
var txt4 = row.FindControl("txt4") as TextBox;
// access the Text property of each, e.g. txt1.Text
}
}
更新:确保当你进行数据源绑定时,它只发生在初始加载而不是后续回发,否则你的更改每次都会被重置。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GridView1.DataSource = // data source
GridView1.DataBind();
}
}