Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    C# aiuto repeater & update dati

    Ciao a tutti, avrei bisogno di capire una cosa.... ho un repeater che mi permette di visualizzare i dati del database in modo editabile in un textbox, con affianco un pulsante per fare l'update dei dati , però non riesco a fare l'update, perchè tra tutte le prove che ho fatto , o mi riporta la modifica di un record su tutti gli altri o non fa niente... nessuna eccezzione o errore in compilazione....

    la pagina aspx è questa
    <asp:Repeater ID="myRepeater" runat="server" OnItemCommand="onUpdate">
    <HeaderTemplate>
    <table width="90%" border=1>
    </HeaderTemplate>
    <ItemTemplate>
    <tr>
    <td><asp:Label ID="idPage" Text='<%# DataBinder.Eval(Container.DataItem,"idPage") %>' Font-Bold="true" runat="server" /></td>
    <td><asp:TextBox ID="titolo" TextMode="SingleLine" Text='<%# DataBinder.Eval(Container.DataItem,"titolo") %>' Enabled="false" Font-Bold="true" runat="server" /></td>
    <td><asp:TextBox ID="contenuto" TextMode="MultiLine" Columns="50" Rows="10" Text='<%# DataBinder.Eval(Container.DataItem,"contenuto") %>' runat="server" /></td>
    <td><asp:button id="btnAggiorna" runat="server" text="aggiorna" /></td>
    </tr>
    </ItemTemplate>
    <FooterTemplate>
    </table>
    </FooterTemplate>

    mentre il codice c# è il seguente



    OleDbDataReader getPage()
    {
    String cnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("mdb-database/gest_sito.mdb");
    OleDbConnection odbcn = new OleDbConnection(cnn);
    OleDbCommand odbcmd = new OleDbCommand("SELECT idPage, contenuto, titolo FROM pagine", odbcn);
    odbcn.Open();
    OleDbDataReader read = odbcmd.ExecuteReader(CommandBehavior.CloseConnecti on);
    return read;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
    if (!Page.IsPostBack)
    {
    myRepeater.DataSource = getPage();
    myRepeater.DataBind();
    }
    }

    protected void updatePage(String idPage, String titolo, String contenuto)
    {
    String cnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("mdb-database/gest_sito.mdb");
    OleDbConnection odbcn = new OleDbConnection(cnn);
    OleDbCommand odbcmd = new OleDbCommand("UPDATE pagine SET titolo = ?, contenuto= ? WHERE idPage =?" , odbcn);
    odbcmd.Parameters.Add(new OleDbParameter("@idPage", idPage));
    odbcmd.Parameters.Add(new OleDbParameter("@titolo", titolo));
    odbcmd.Parameters.Add(new OleDbParameter("@contenuto", contenuto));
    odbcn.Open();
    odbcmd.ExecuteNonQuery();
    odbcn.Close();

    }

    protected void onUpdate(object source, RepeaterCommandEventArgs e)
    {
    String id = ((Label)e.Item.FindControl("idPage")).Text;
    String tit = ((TextBox)e.Item.FindControl("titolo")).Text;
    String cont = ((TextBox)e.Item.FindControl("contenuto")).Text;
    updatePage(id, tit, cont);
    Response.Redirect("pagina.aspx");

    }


    Qualcuno sa darmi qualche consiglio del perchè non funziona?
    Ciao .... e grazie

  2. #2
    Nessuno sa dirmi cosa non va nel codice???? sto provando di tutto ma non va....boh


  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    questo codice sembra che vada. Ho dovuto un poco adattarlo per il mio database:

    codice:
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
                this.bindData();   
        }
    
        protected void onUpdate(object source, RepeaterCommandEventArgs e)
        {
            Repeater r = (Repeater)source;
            if (e.CommandName == "aggiorna")
            {
                int id = int.Parse(e.CommandArgument.ToString());
                string contenuto = ((TextBox)e.Item.FindControl("contenuto")).Text;
                
                updatePage(id, contenuto);
                this.bindData();
            }
        }
    
        void bindData()
        {
            ModuloWeb.DataBind(this.myRepeater, MioModulo.StringaConnessioneTest, "SELECT * FROM CAMPI");
        }
    
        protected void updatePage(int id, String contenuto)
        {
            OleDbConnection connessione = new OleDbConnection(MioModulo.StringaConnessioneTest);
            connessione.Open();
    
            OleDbCommand comando = connessione.CreateCommand();
            comando.CommandText = "UPDATE [CAMPI] SET [MEMO] = ? WHERE [ID] = ? ";
            comando.Parameters.Clear();
    
            comando.Parameters.Add("memo", OleDbType.VarChar, 50).Value = ModuloWeb.StringNullToDBNull(contenuto); ;
    
            comando.Parameters.Add("id", OleDbType.Integer).Value = id;
    
            comando.ExecuteNonQuery();
    
            connessione.Close();
            
            
            
        }
        
        
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Pagina senza titolo</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Repeater ID="myRepeater" runat="server" OnItemCommand="onUpdate" EnableViewState="true">
                    <HeaderTemplate>
                        <table width="90%" border="1">
                    </HeaderTemplate>
                    <ItemTemplate>
                        <tr>
                            <td>
                                <asp:Label ID="idPage" Text='<%# DataBinder.Eval(Container.DataItem,"id") %>' Font-Bold="true" runat="server" /></td>
                            <td>
                                <asp:TextBox ID="titolo" TextMode="SingleLine" Text='<%# DataBinder.Eval(Container.DataItem,"testo") %>' Enabled="false" Font-Bold="true" runat="server" /></td>
                            <td>
                                <asp:TextBox ID="contenuto" TextMode="MultiLine" Columns="50" Rows="10" Text='<%# DataBinder.Eval(Container.DataItem,"memo") %>' runat="server" /></td>
                            <td>
                                <asp:Button ID="btnAggiorna" runat="server" Text="aggiorna" CommandName="aggiorna" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"id") %>' /></td>
                        </tr>
                    </ItemTemplate>
                    <FooterTemplate>
                        </table>
                    </FooterTemplate>
                </asp:Repeater>
            </div>
        </form>
    </body>
    </html>
    Pietro

  4. #4
    Grazie Mille Pietro , ho visto il codice ora ma sono a lavoro e non ho modo di provare, solo che controllandolo non capisco una cosa , quando chiami l' oggetto ModuloWeb non capisco qual'è , MioModulo , presumo invece sia il nome assegnato a quell'oggetto, nel codice vengono usati ma dove li prendi?

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da leogtr
    Grazie Mille Pietro , ho visto il codice ora ma sono a lavoro e non ho modo di provare, solo che controllandolo non capisco una cosa , quando chiami l' oggetto ModuloWeb non capisco qual'è , MioModulo , presumo invece sia il nome assegnato a quell'oggetto, nel codice vengono usati ma dove li prendi?
    non puoi capire perchè non ho spiegato. E' un modulo basic con delle funzioni riutilizzabili, ossia una classe c# con tutti i membri static.
    Pietro

  6. #6
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848
    Ciao Pietro, stavo utilizzando il tuo template per poter utilizzare un repeater in modo che mi salvi il contenuto di una semplice tabella rappresentante 2 colonne: Citta (non modificabile dall'utente, ed è anche la chiave primaria), e Costo (modificabile dall'utente).
    Uso il FW 2.0.
    Questo è il codice html del repeater:

    <asp:Repeater ID="rpCosti" EnableViewState="true" runat="server" OnItemCommand="OnUpdate">

    <ItemTemplate>
    <tr>
    <td><asp:Label ID="lblCitta" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Citta") %>' />
    </td>
    <td><asp:TextBox ID="txtCosto" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Costo") %>' />
    </td>
    </tr>
    </ItemTemplate>
    <FooterTemplate>
    <ul class="bottoni_bot">[*]
    <asp:Button id="btnSalva" CommandName="aggiorna" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"Citta") %>' CssClass="bottoneNuovaSalva" Text="SALVA" runat="server" />
    [*]
    <asp:Button id="btnAnnulla" CssClass="bottoneNuovaAnnulla" OnClick="Annulla" Text="ANNULLA" runat="server" />
    [/list]
    </FooterTemplate>
    </asp:Repeater>

    e nel code-behind ho messo:

    protected void OnUpdate(object source, RepeaterCommandEventArgs e)
    {
    Repeater r = (Repeater)source;
    if (e.CommandName == "aggiorna")
    {
    string citta= e.CommandArgument.ToString();
    string costo = ((TextBox)e.Item.FindControl("txtCosto")).Text;

    }
    }


    pur tuttavia mi da' errore, in quanto "citta" risulta nullo:

    Exception Details: System.NullReferenceException: Object reference not set to an instance of an object

    In cosa sbaglio?

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    certo che non funziona.
    Nell'esempio precedente c'era un pulsante per record e potevi ricavarti l'item cliccato e tutto il suo contenuto. Perciò, per salvare tutto era necessario premere tutti i pulsanti

    Tu invece, metti un solo pulsante, perciò devi farti la scansione degli item del repeater:

    codice:
        protected void OnUpdate(object source, RepeaterCommandEventArgs e)
        {
            Repeater r = (Repeater)source;
            for (int i = 0; i < r.Items.Count; i++)
            {
                string citta = ((Label)r.Items[i].FindControl("lblCitta")).Text;
                string costo = ((TextBox)r.Items[i].FindControl("txtCosto")).Text;
                
                lib.PrintLn(costo, citta);//==>ok, mostra costo e città
            }
    
    
        }
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.