Gridview 页脚不是实例

Posted

技术标签:

【中文标题】Gridview 页脚不是实例【英文标题】:Gridview Footer Not an Instance 【发布时间】:2018-09-23 02:44:12 【问题描述】:

我正在尝试为 gridview 页脚文本框获取自动 ID 填充符,但每次运行时我都会得到“对象的未引用实例”,这意味着该方法没有找到文本框,对吗? 但是我在其他方法中有相同的文本框并且工作正常,它有什么问题?

下面是GridView的代码示例

   <asp:GridView ID="GridView1" runat="server" BackColor="#CCCCCC" BorderColor="#999999" BorderStyle="Solid" BorderWidth="3px" CellPadding="4" CellSpacing="2" ForeColor="Black" AutoGenerateColumns="False" ShowFooter="True">
            <Columns>
                <asp:TemplateField HeaderText="ID UNIDAD">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ID_UNIDAD") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:TextBox ID="txtAddID" runat="server" ></asp:TextBox>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lbl_ID" runat="server" Text='<%# Bind("ID_UNIDAD") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="UNIDAD">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("NOMBRE") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:TextBox ID="txtNombre" runat="server" ></asp:TextBox>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lbl_Nombre" runat="server" Text='<%# Bind("NOMBRE") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                   <asp:TemplateField HeaderText="FRACCIONES">
                    <EditItemTemplate>
                        <asp:CheckBox ID="TextBox3" runat="server" Checked='<%# Bind("FRACCIONES") %>'></asp:CheckBox>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:CheckBox ID="chkFraccion" runat="server" ></asp:CheckBox>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:CheckBox ID="lbl_Fraccion" runat="server" Checked='<%# Bind("FRACCIONES") %>' ></asp:CheckBox>
                    </ItemTemplate>
                </asp:TemplateField>
                   <asp:TemplateField HeaderText="CLAVE SAT">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("CLAVE_SAT") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:TextBox ID="txtClave" runat="server" ></asp:TextBox>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lbl_Clave" runat="server" Text='<%# Bind("CLAVE_SAT") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <FooterTemplate>
                        <asp:ImageButton ID="Agregar" runat="server" ImageUrl="~/assets/iconos/add.ico" OnClick="Agregar_Click" />       
                    </FooterTemplate>
                </asp:TemplateField>
            </Columns>
            <FooterStyle BackColor="#CCCCCC" />
            <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#CCCCCC" ForeColor="Black" HorizontalAlign="Left" />
            <RowStyle BackColor="White" />
            <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
            <SortedAscendingCellStyle BackColor="#F1F1F1" />
            <SortedAscendingHeaderStyle BackColor="#808080" />
            <SortedDescendingCellStyle BackColor="#CAC9C9" />
            <SortedDescendingHeaderStyle BackColor="#383838" />
        </asp:GridView> 

下面是在后面的代码中绑定网格的代码示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.UI.htmlControls;
using System.Windows.Input;


public partial class Default2 : System.Web.UI.Page

    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Integral Database"].ToString());
    string query;
    string countid = " ";
    SqlConnection connStr = new SqlConnection(ConfigurationManager.ConnectionStrings["Integral Database"].ToString());
    string connStrr = ConfigurationManager.ConnectionStrings["Integral Database"].ConnectionString;
    protected void Page_Load(object sender, EventArgs e)
    
        if (!IsPostBack)

            llenagrid();
        IncrementoID();
    



    public void llenagrid()
    
      DataTable table = new DataTable();
      using (SqlConnection conn = new SqlConnection(connStrr))
      
          string sql = "SELECT id_unidad, nombre, fracciones, clave_sat from unidades";
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            
                using (SqlDataAdapter ad = new SqlDataAdapter(cmd))
                
                    ad.Fill(table);
                
           
       
      IncrementoID();
  GridView1.DataSource = table;
  GridView1.DataBind();        
    



    protected void Agregar_Click(object sender, ImageClickEventArgs e)
    
        connStr.Open();
        GridViewRow row = GridView1.FooterRow;
        TextBox txtNombre = (TextBox)row.FindControl("txtNombre");
        string str = "select count(nombre) from unidades where nombre like '"+txtNombre.Text+ "'";
        SqlCommand com = new SqlCommand(str,connStr);
        int count = Convert.ToInt32(com.ExecuteScalar());
        connStr.Close();
        if (count > 0)
        
            string script = "alert('Este Nombre ya Existe.','Atención');";
            ScriptManager.RegisterStartupScript(this, this.GetType(), "testScript", script, true);
        
        else
        
            connStr.Open();
            TextBox txtID = (TextBox)row.FindControl("txtAddID");
            CheckBox chkFracc = (CheckBox)row.FindControl("chkFraccion");
            TextBox txtClave = (TextBox)row.FindControl("txtClave");
            string ID = txtID.Text;
            string Nombre = txtNombre.Text;
            bool Fracc = chkFracc.Checked;
            string clave = txtClave.Text;
            string query2 = "Insert into unidades values('" + ID + "','" + Nombre + "','" + Fracc + "','" + clave + "')";
            SqlCommand cmd2 = new SqlCommand(query2, connStr);
            cmd2.ExecuteNonQuery();
            connStr.Close();
            llenagrid();
            IncrementoID();
        

     


    public void IncrementoID()
    
        //query = "select Count(id_unidad) from unidades";
        //con.Open();
        //SqlCommand cmd = new SqlCommand(query, con);
        //string cid = cmd.ExecuteScalar().ToString();
        //con.Close();
        //TextBox ID = (TextBox)GridView1.FooterRow.FindControl("txtAddID");
        //ID.Text = countid + (int.Parse(cid) + 1);
        //ID.ReadOnly = true;

        con.Open();
        SqlCommand cmd = new SqlCommand("select MAX (CAST( ID_UNIDAD as INT)) from unidades",con);
        SqlDataReader rd = cmd.ExecuteReader();
        TextBox txtID = ((TextBox)GridView1.FooterRow.FindControl("txtAddID"));
        if (rd.Read())
        
            string Value = rd[0].ToString();
            if (Value == "")
            

                txtID.Text = "1";
            
            else
            
                txtID.Text = rd[0].ToString();
                txtID.Text = (Convert.ToInt64(txtID.Text) + 1).ToString();
            
        
        con.Close();
    

    

如您所见,在插入方法中它找到了 gridview 文本框 (txtAddID),当我尝试在 IncrementoID 方法中使用相同的语法时它不起作用。

【问题讨论】:

【参考方案1】:

这是方法 llenagrid() 中的问题,在绑定 GridView 之前,您尝试访问 Gridview 中的控件(在方法 IncrementoID 中),因此它给出了错误 Not Referred Instance of an object 表示您尝试访问的对象尚未被引用。下面的代码示例可以帮助您:

public void llenagrid()
  
          DataTable table = new DataTable();
          using (SqlConnection conn = new SqlConnection(connStrr))
          
              string sql = "SELECT id_unidad, nombre, fracciones, clave_sat from unidades";
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                
                    using (SqlDataAdapter ad = new SqlDataAdapter(cmd))
                    
                        ad.Fill(table);
                    
               
           
      //IncrementoID(); // Remove the function call from here
      GridView1.DataSource = table;
      GridView1.DataBind(); 
      IncrementoID();  // Call the function after GridView got binded.      
   

【讨论】:

非常感谢,这就是解决方案。你是最棒的!

以上是关于Gridview 页脚不是实例的主要内容,如果未能解决你的问题,请参考以下文章

在 Gridview 的页脚中访问链接按钮单击事件

GridView 在回发或 onselectedindexchanged 后丢失数据表页眉和页脚

Flutter GridView 页脚(用于指示无限滚动的负载)

dev gridcontrol绘制页脚

如何使用展开和折叠数据行的选项将页脚模板添加到 gridview?C#/ASP.NET

asp.net的gridview控件问题