获取gridview的页脚行单元格值

Rub*_*uby 8 c# asp.net gridview webforms

我在页脚中有两个文本框的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>
   &nbsp;<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>
Run Code Online (Sandbox Code Playgroud)

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

文本框是txtNewId,txtNewName.

小智 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();
        }
     }
}
Run Code Online (Sandbox Code Playgroud)


rec*_*ace 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();
}
Run Code Online (Sandbox Code Playgroud)

编辑 视图状态不起作用的原因是因为视图状态仅在回发之间持续。会话在用户会话期间保持活动状态。默认空闲时间为 20 分钟。

您通常会使用 ViewState 在回发期间在页面之间保留数据。

这并不涉及最佳实践,这只是它的本质。