asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 11215
ASPCode.it - Store

  > > Articoli

Aggiornare un set di dati senza ricorrere al DataGrid Edit

Data di pubblicazione: 26/01/2004        Voto della community: 0,00 (Votanti: 0)


Questa volta ci occupiamo di un compito relativamente semplice ma che mi ha procurato qualche grattacapo quando sono passato all'implementazione in ASP.NET. Vogliamo editare e aggiornare un set di dati visualizzati a schermo senza per˛ fare ricorso alla funzione di editing a corredo del DataGrid. Vogliamo inoltre presentare i dati direttamente in modalitÓ di editing, ossia in caselle di testo editabili, con un pulsante per l'aggiornamento per ciascuna riga del set di dati.

Presento qui una possibile soluzione, non escludo per˛ che ce ne siano di migliori. La soluzione Ŕ applicabile a set di dati collegati indifferentemente ad un DataGrid, DataList o Repeater. Nel codice di esempio usiamo un Repeater. La sorgente dati Ŕ la tabella Categorie del database Northwind.mdb.


<%@ Page Language="C#" Debug="true" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

    public ArrayList arrNomeCategoria= new ArrayList();
    public ArrayList arrDescrizione=new ArrayList();
    public ArrayList arrId =new ArrayList();
    public int riga = 0;
   
    OleDbDataReader getProdotti () {
   
                    string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
                    OleDbConnection cnn = new OleDbConnection(strCnn) ;
                    OleDbCommand cmd = new OleDbCommand ("SELECT TOP 10 IDCategoria, NomeCategoria, Descrizione FROM categorie" , cnn);
                    cnn.Open();
                    OleDbDataReader myReader;
                    myReader =  cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    return myReader;
    }
   
    void aggiornaDb (string id, string nomeCategoria, string descrizione) {
   
                    string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
                    OleDbConnection cnn = new OleDbConnection(strCnn) ;
                    OleDbCommand cmd = new OleDbCommand ("UPDATE Categorie SET NomeCategoria=?, Descrizione=? WHERE idCategoria=?" , cnn);
                    cmd.Parameters.Add(new OleDbParameter("@nomecategoria", nomeCategoria ));
                      cmd.Parameters.Add(new OleDbParameter("@descrizione", descrizione ));
                    cmd.Parameters.Add(new OleDbParameter("@id", id ));
                    cnn.Open();
                    cmd.ExecuteNonQuery();
                    cnn.Close();
    }
   
    void rep_dataBound (object sender, RepeaterItemEventArgs e) {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)  {
            ((Button)e.Item.FindControl("buttonAggiorna")).CommandArgument = riga++.ToString();
        }
    }
 
    void id_load (object sender, EventArgs e) {
   
        string id = ((Label)sender).Text;
        arrId.Add (id);
    }
   
    void nomeCategoria_load (object sender, EventArgs e) {
   
        string nomeCategoria = ((TextBox)sender).Text;
        arrNomeCategoria.Add (nomeCategoria);
    }
   
    void descrizione_load (object sender, EventArgs e) {
   
        string descrizione = ((TextBox)sender).Text;
        arrDescrizione.Add (descrizione);
    }
   
    void rep_command (object sender, RepeaterCommandEventArgs e) {
   
        int indice = Convert.ToInt32 ( e.CommandArgument );
        aggiornaDb (arrId[indice].ToString(), arrNomeCategoria[indice].ToString(), arrDescrizione [indice].ToString() );
   
        repeater1.DataSource= getProdotti ();
        repeater1.DataBind();
  }
   
  void Page_Load () {
   
        if (!Page.IsPostBack) {
          repeater1.DataSource= getProdotti ();
          repeater1.DataBind();
        }
  }

</script>

<html>
<head>
</head>
<body>
    <form runat="server">
        <table width="100%" border="1">
            <asp:Repeater id="repeater1" runat="server" onItemCommand="rep_command" onItemDataBound="rep_dataBound">
                <ItemTemplate>
                    <tr>
                        <td align="center">
                            <asp:Label id="lblID" onLoad="id_load" text='<%#DataBinder.Eval (Container.DataItem, "IDCategoria")%>' runat="server" /></td>
                        <td align="center">
                            <asp:textbox  onLoad="nomeCategoria_load" id="textBoxNomeCategoria" Text='<%#DataBinder.Eval (Container.DataItem, "NomeCategoria")%>' runat="server" />
                        </td>
                        <td align="center">
                            <asp:textbox  onLoad="descrizione_load" id="textBoxDescrizione" Text='<%#DataBinder.Eval (Container.DataItem, "Descrizione")%>' runat="server" />
                        </td>
                        <td align="center">
                            <asp:button id="buttonAggiorna" runat="server" text="aggiorna" />
                        </td>
                    </tr>
                </ItemTemplate>
            </asp:Repeater>
            <tbody>
            </tbody>
        </table>
    </form>

</body>
</html>

Il Repeater come si vede contiene una Label (che ospiterÓ il campo IDCategoria), due TextBox (per i campi NomeCategoria e Descrizione, editabili) e un controllo Button per l'aggiornamento della riga. Nella prima richiesta della pagina ( if(!Page.IsPostBack) ), il Repeater Ŕ collegato alla sorgente dati. Il problema Ŕ risalire, nelle successive richieste, alla riga in corrispondenza della quale Ŕ stato premuto il pulsante per l'aggiornamento (che si intende dunque aggiornare) e al corrispondente valore delle caselle di testo.
Il primo problema Ŕ superato settando, durante il databinding del Repeater, la proprietÓ CommandArgument di ciascun pulsante per l'aggiornamento, al numero di riga corrispondente, partendo da 0. Durante il postback, basterÓ riferirsi, nella procedura di gestione dell'evento OnItemCommand del Repeater, ad e.CommandArgument per risalire alla riga che ha richiesto l'aggiornamento. Il secondo problema (risalire ai corrispondenti valori delle caselle di testo) Ŕ risolto come segue: nel postback, precisamente nella fase Load dei server control, le caselle di testo conterranno i valori precedenti, eventualmente modificati dall'utente. Basta dunque salvare, nell'evento Load di ciascuno dei controlli (compresa la Label contenente gli IDCategoria) la proprietÓ Text in altrettanti ArrayList pubblici, in maniera da essere accessibili altrove. Infine, nell'evento onItemCommand del Repeater (che Ŕ cronologicamente successivo all'evento Load dei vari server control) si recuperano i valori dei tre controlli (IDCategoria, NomeCategoria e Descrizione) dai corrispondenti ArrayList alla posizione 'e.CommandArgument' che contiene - come detto - la posizione della riga che ha richiesto l'aggiornamento. Si pu˛ a questo punto aggiornare il database, avendo a disposizione tutti i dati del record interessato.




Utenti connessi: 11215