获取gridview的页脚行单元格值

时间:2013-09-16 10:26:23

标签: c# asp.net gridview webforms

我在页脚中有两个文本框的gridview。需要的是获取文本框值,将其存储到数据表,然后将其绑定到gridview。 我无法获取文本框值。它们显示为空(如您所见)。我哪里错了。

enter image description here

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>

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。

7 个答案:

答案 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

我希望这会有所帮助。