我在页脚中有两个文本框的gridview。需要的是获取文本框值,将其存储到数据表,然后将其绑定到gridview。 我无法获取文本框值。它们显示为空(如您所见)。我哪里错了。
ASPX:
<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False"
ShowFooter="true" OnRowDataBound="gv_RowDataBound"
OnRowCommand="gv_RowCommand">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkEdit" runat="server" Text="Edit" CommandName="Edit">
</asp:LinkButton>
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton ID="lnkUpdate" runat="server" Text="Update"
CommandName="Update"></asp:LinkButton>
<asp:LinkButton ID="lnkCancel" runat="server" Text="Cancel"
CommandName="Cancel"></asp:LinkButton>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="S.No">
<ItemTemplate>
<%#Container.DataItemIndex %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:Label ID="lbId" runat="server" Text='<%#Eval("id") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtId" runat="server" Text='<%#Eval("id") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtNewId" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtNewId"
SetFocusOnError="true"
ErrorMessage="*" ForeColor="Red"></asp:RequiredFieldValidator>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="NAME">
<ItemTemplate>
<asp:Label ID="lbName" runat="server" Text='<%#Eval("name") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtName" runat="server" Text='<%#Eval("name") %>'>
</asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtNewName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ControlToValidate="txtNewName" SetFocusOnError="true"
ErrorMessage="*" ForeColor="Red"></asp:RequiredFieldValidator>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lnkDelete" runat="server" Text="Delete"
CommandName="Delete"></asp:LinkButton>
</ItemTemplate>
<FooterTemplate>
<asp:LinkButton ID="lnkInsert" runat="server" Text="Insert"
CommandName="Insert" ></asp:LinkButton>
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
CS:
protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
{
DataTable dt = new DataTable();
switch (e.CommandName)
{
case "Insert":
GridViewRow fRow = gv.FooterRow;
dt.Columns.Add("id");
dt.Columns.Add("name");
dt = (DataTable)ViewState["students"];
DataRow dr = dt.NewRow();
dr["id"] = ((TextBox)fRow.FindControl("txtNewId")).Text;
dr["name"] = ((TextBox)fRow.FindControl("txtNewName")).Text;
dt.Rows.Add(dr);
ViewState["students"] = dt;
gv.DataSource = ViewState["students"];
gv.DataBind();
break;
}
}
文本框是txtNewId,txtNewName。
答案 0 :(得分:5)
不要使用grid_Row命令进行插入。使用按钮单击事件
像这样。它将解决您的问题protected void OnCmdInsertClick(object sender, EventArgs e)
{
//Grid's footer row
var footerRow = gv.FooterRow;
if(footerRow !=null)
{
//get your textbox instances
var txtNewId = (TextBox) footerRow.FindControl("txtNewId");
var txtNewName = (TextBox) footerRow.FindControl("txtNewName");
// Check for null
if(txtNewId !=null && txtNewName !=null)
{
var dt = (DataTable)ViewState["students"];
DataRow dr = dt.NewRow();
dr["id"] = txtNewId.Text;
dr["name"] = txtNewName.Text;
dt.Rows.Add(dr);
ViewState["students"] = dt;
gv.DataSource = ViewState["students"];
gv.DataBind();
}
}
}
答案 1 :(得分:4)
在按钮单击事件中,使用以下内容获取footerL的实际GridViewRow
protected void insertButton_Click(object sender, EventArgs e)
{
// This is the crux -
GridViewRow row = (GridViewRow)((sender as Button).NamingContainer);
// ...
// then you can get your textboxes
// Since we know it's an insert
dt.Columns.Add("id");
dt.Columns.Add("name");
dt = (DataTable)Session["students"];
DataRow dr = dt.NewRow();
TextBox txtnewid = (TextBox) row.FindControl("txtNewId");
TextBox txtnewName = (TextBox) row.FindControl("txtNewName");
dr["id"] = txtnewid.Text;
dr["name"] = txtnewName.Text ;
dt.Rows.Add(dr);
Session["students"] = dt;
gv.DataSource = dt;
gv.DataBind();
}
修改强> viewstate不起作用的原因是因为viewstate仅在回发之间持续。会话在用户会话期间保持活动状态。默认值为20分钟的空闲时间。
在回发期间,您通常会使用ViewState在页面之间保留数据。
这并不能解决最佳实践,它就是它的本质。
答案 2 :(得分:3)
请检查您是否在页面加载中正确绑定网格视图。我的意思是你是否在if condidtion中具有约束力
if(!IspostBack)
{
BindGridView();
}
我希望这会有所帮助。看看吧..
答案 3 :(得分:3)
protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
{
DataTable dt = new DataTable();
if (e.CommandName.Equals("Insert"))
{
GridViewRow fRow = gv.FooterRow;
dt.Columns.Add("id");
dt.Columns.Add("name");
dt = (DataTable)ViewState["students"];
DataRow dr = dt.NewRow();
TextBox txtnewid = (TextBox) fRow.FindControl("txtNewId");
TextBox txtnewName = (TextBox) fRow.FindControl("txtNewName");
dr["id"] = txtnewid.Text;
dr["name"] = txtnewName.Text ;
dt.Rows.Add(dr);
ViewState["students"] = dt;
gv.DataSource = ViewState["students"];
gv.DataBind();
}
}
答案 4 :(得分:3)
要使用数据绑定页脚,请使用以下代码
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Footer)
{
TextBox txtNewId = (TextBox)e.Row.FindControl("txtNewId");
txtNewId.Text = "New 01";
}
}
...并从页脚文本框中检索值
TextBox txtNewId = (TextBox)gvGrid.FooterRow.FindControl("txtNewId");
答案 5 :(得分:2)
使用此,
TextBox txtName = GridView1.FooterRow.FindControl("yourtextboxId") as TextBox;
string name = txtName.Text;
或者
GridViewRow row = ((GridView)sender).FooterRow;
TextBox txtName = (TextBox)row.FindControl("yourtextboxId");
if (txtName == null)
{
return;
}
string name = txtName.Text;
答案 6 :(得分:0)
我遇到了同样的问题,获得该值的最佳方法是使用:
((TextBox)<grid_name>.FooterRow.FindControl("<textBox_id>")).Text
我希望这会有所帮助。