none
[C# net4] GridView vuota presenta errore

    Domanda

  • Ciao a tutti.

    Sto provando ad utilizzare questo tutorial web molto interessante:
    http://aspsnippets.com/Articles/Bind-DropDownList-in-GridView-FooterTemplate-Footer-Row-in-ASPNet.aspx

    Nel mio caso però quando la GridView è vuota la pagina aspx va in errore:

    Object reference not set to an instance of an object

    In questa linea prevista nel codice dell'evento OnDataBound:

    DropDownList Newcombo = DecoderView.FooterRow.FindControl("Newcombo") as DropDownList;

    Potreste aiutarmi a capire dove sbaglio?
    Grazie

    .aspx

                        <asp:GridView ID="DecoderView" runat="server" AllowPaging="True" AllowSorting="true"
                            AutoGenerateColumns="False" PageSize="4" ShowHeader="true" OnPageIndexChanging="DecoderView_PageIndexChanging"
                            CssClass="mGrid" EmptyDataText="Nessuna segnalazione" DataKeyNames="ID" OnRowEditing="DecoderView_RowEditing"
                            OnRowCancelingEdit="DecoderView_RowCancelingEdit" OnRowCommand="DecoderView_RowCommand"
                            OnRowUpdating="DecoderView_RowUpdating" OnRowDeleting="DecoderView_RowDeleting"
                            OnRowDataBound="DecoderView_RowDataBound" OnDataBound="OnDataBound" ShowFooter="true"
                            HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White" RowStyle-BackColor="#A1DCF2"
                            AlternatingRowStyle-BackColor="White" AlternatingRowStyle-ForeColor="#000">

    <asp:TemplateField HeaderText="combo"> <ItemTemplate> <center> <asp:Label ID="combo" runat="server" Text='<%# Bind("comboSplit") %>' ToolTip="combo"></asp:Label></center> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Editcombo" runat="server" AutoPostBack="true"> </asp:DropDownList> <asp:Label ID="comboID" runat="server" Text='<%# Bind("combo") %>' Visible="false"></asp:Label> <asp:RequiredFieldValidator ID="Editcombo1" runat="Server" ControlToValidate="Editcombo" ErrorMessage="combo: Campo obbligatorio" Text="***"></asp:RequiredFieldValidator> </EditItemTemplate> <FooterTemplate> <asp:DropDownList ID="Newcombo" runat="server" AutoPostBack="true"> </asp:DropDownList> <asp:RequiredFieldValidator ID="Newcombo1" runat="Server" ControlToValidate="Newcombo" ErrorMessage="combo: Campo obbligatorio" Text="***"></asp:RequiredFieldValidator> </FooterTemplate> </asp:TemplateField>

    .cs

        protected void decoderViewSource()
        {
            DataSet ds = new DataSet();
    
            sql = "SELECT ... ";  
    
            using (OdbcConnection conn =
                new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString))
            {
                using (OdbcCommand cmd =
                    new OdbcCommand(sql, conn))
                {
                    try
                    {
                        conn.Open();
                        OdbcDataAdapter adapter = new OdbcDataAdapter(sql, conn);
                        adapter.Fill(ds);
                        DataView dv = new DataView();
    
                    if (ds.Tables.Count > 0)
                    {
                        dv = ds.Tables[0].DefaultView;
    
                        if (ds.Tables[0].Rows.Count > 0)
                        {
                            lblMessage.Text = " " + ds.Tables[0].Rows.Count.ToString("n0", culture);
                        }
                        else
                        {
                            lblMessage.Text = "0";
                        }
    
                        DecoderView.DataSource = dv;
                        DecoderView.DataBind();
                    }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
        }
    
    
    
    
    protected void OnDataBound(object sender, EventArgs e)
        {
            sql = "SELECT ";
            sql = sql + " denom
            sql = sql + "FROM ";
            sql = sql + " tbl_xxx; ";
    
            DropDownList Newcombo = DecoderView.FooterRow.FindControl("Newcombo") as DropDownList;
            Newcombo.DataSource = GetData(sql);
            Newcombo.DataTextField = "denom";
            Newcombo.DataValueField = "denom";
            Newcombo.DataBind();
            Newcombo.Items.Insert(0, new ListItem("------", ""));
        }



    • Modificato cms9651 giovedì 12 settembre 2013 14:14
    giovedì 12 settembre 2013 14:13

Risposte

  • Scusa, my mistake, per caricare la dropdownlist nel footer devi mettere:

      if (e.Row.RowType == DataControlRowType.Footer)
            {  
            sql = "SELECT ";
            sql = sql + " denom
            sql = sql + "FROM ";
            sql = sql + " tbl_xxx; ";
    
            DropDownList Newcombo = (DropDownList)e.Row.FindControl("Newcombo");        Newcombo.DataSource = GetData(sql);
            Newcombo.DataTextField = "denom";
            Newcombo.DataValueField = "denom";
            Newcombo.DataBind();
            Newcombo.Items.Insert(0, new ListItem("------", ""));                
            }

    Prova e fammi sapere

    Ciao


    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.


    martedì 17 settembre 2013 15:24
    Moderatore

Tutte le risposte

  • Verifica che la query per la lista sia corretta e che il metodo

    GetData(sql)

    Rstituisca dei dati

    Ciao


    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    lunedì 16 settembre 2013 07:19
    Moderatore
  • Verifica che la query per la lista sia corretta e che il metodo

    GetData(sql)

    Rstituisca dei dati

    Ciao


    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    Grazie.

    La query provata nel db mysql funziona correttamente, così come il metodo:

    GetData(sql)

    La cosa strana è che se ho una riga già memorizzata nella tabella che popola la GV tutto funziona correttamente, sia se provo a editare la riga esistente o aggiungere una nuova riga alla GV.

    Se, invece, la tabella che popola la GV è vuota ecco di nuovo l'errore:

    Object reference not set to an instance of an object

    lunedì 16 settembre 2013 13:47
  • Nel metodo OnDatabound prova a mettere il seguente controllo:

     if(e.Row.RowType == DataControlRowType.DataRow)
        {
          // ...
          
        }
    Ciao

    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    lunedì 16 settembre 2013 15:56
    Moderatore
  • Nel metodo OnDatabound prova a mettere il seguente controllo:

     if(e.Row.RowType == DataControlRowType.DataRow)
        {
          // ...
          
        }
    Ciao

    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    Grazie, provo così ma la pagina aspx va in errore:

    Compiler Error Message: CS1061: 'System.EventArgs' does not contain a definition for 'Row' and
    no extension method 'Row' accepting a first argument of type
    'System.EventArgs' could be found (are you missing
    a using directive or an assembly reference?)


    protected void OnDataBound(object sender, EventArgs e) { sql = "SELECT "; sql = sql + " denom sql = sql + "FROM "; sql = sql + " tbl_xxx; "; if(e.Row.RowType == DataControlRowType.DataRow) { DropDownList Newcombo = DecoderView.FooterRow.FindControl("Newcombo") as DropDownList; Newcombo.DataSource = GetData(sql); Newcombo.DataTextField = "denom"; Newcombo.DataValueField = "denom"; Newcombo.DataBind(); Newcombo.Items.Insert(0, new ListItem("------", "")); } }


    lunedì 16 settembre 2013 20:08
  • Prova a mettere il codice nell'evento
    DecoderView_RowDataBound
    Ciao

    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    lunedì 16 settembre 2013 20:38
    Moderatore
  • Ok, grazie procedo così:

    1. dalla gridview ho eliminato OnDataBound="OnDataBound";
    2. nell'evento DecoderView_RowDataBound:
        protected void DecoderView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {  
            sql = "SELECT ";
            sql = sql + " denom
            sql = sql + "FROM ";
            sql = sql + " tbl_xxx; ";
    
            DropDownList Newcombo = DecoderView.FooterRow.FindControl("Newcombo") as DropDownList;
            Newcombo.DataSource = GetData(sql);
            Newcombo.DataTextField = "denom";
            Newcombo.DataValueField = "denom";
            Newcombo.DataBind();
            Newcombo.Items.Insert(0, new ListItem("------", ""));                
            }
        }
    1. non ho errori ma quando provo ad aggiungere una nuova riga nella gridview il footer non si attiva...
                                    <FooterTemplate>
                                        <asp:DropDownList ID="Newcombo" runat="server" AutoPostBack="true">
                                        </asp:DropDownList>
                                        <asp:RequiredFieldValidator ID="Newcombo1" runat="Server" ControlToValidate="Newcombo"
                                            ErrorMessage="Campo obbligatorio" Text="***"></asp:RequiredFieldValidator>
                                    </FooterTemplate>

    lunedì 16 settembre 2013 20:55
  • Scusa, my mistake, per caricare la dropdownlist nel footer devi mettere:

      if (e.Row.RowType == DataControlRowType.Footer)
            {  
            sql = "SELECT ";
            sql = sql + " denom
            sql = sql + "FROM ";
            sql = sql + " tbl_xxx; ";
    
            DropDownList Newcombo = (DropDownList)e.Row.FindControl("Newcombo");        Newcombo.DataSource = GetData(sql);
            Newcombo.DataTextField = "denom";
            Newcombo.DataValueField = "denom";
            Newcombo.DataBind();
            Newcombo.Items.Insert(0, new ListItem("------", ""));                
            }

    Prova e fammi sapere

    Ciao


    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.


    martedì 17 settembre 2013 15:24
    Moderatore
  • Grazie, procedo così:

    1. Ho eliminato dalla GridView l'evento OnDataBound="OnDataBound";
    2. Nella GridView ShowFooter è settato su false;
    3. Dal code-behind ho eliminato protected void OnDataBound(object sender, EventArgs e);
    4. Nel code -behind in RowDataBound ho inserito:
    if (e.Row.RowType == DataControlRowType.Footer)
            {  
            sql = "SELECT ";
            sql = sql + " denom
            sql = sql + "FROM ";
            sql = sql + " tbl_xxx; ";
    
            DropDownList Newcombo = (DropDownList)e.Row.FindControl("Newcombo");        Newcombo.DataSource = GetData(sql);
            Newcombo.DataTextField = "denom";
            Newcombo.DataValueField = "denom";
            Newcombo.DataBind();
            Newcombo.Items.Insert(0, new ListItem("------", ""));                
            }

    Ma quando clicco sul pulsante Aggiungi per inserire una nuova riga nella GridView il footer non appare.

    Non ci capisco più nulla ... :(

        protected void AddNewRecord(object sender, EventArgs e)
        {
            DecoderView.ShowFooter = true;
            decoderViewSource();
        }

    mercoledì 18 settembre 2013 07:49
  • Ciao cms9651,

    Sei riuscito a risolvere il tuo problema?


    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    martedì 1 ottobre 2013 12:20
    Moderatore
  • Ciao cms9651,

    Sei riuscito a risolvere il tuo problema?


    Luca Congiu (congiuluc)
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    Si grazie.
    martedì 1 ottobre 2013 16:35