asp - asp.net - aspcode.it

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

  > > Articoli

DataGrid Editing

Data di pubblicazione: 02/02/2004        Voto della community: 2,75 (Votanti: 8)


Trattiamo questa volta le funzionalità di editing messe a disposizione dal controllo DataGrid attraverso un esempio completo. Vogliamo visualizzare i prodotti della tabella omonima di Nothwind e la rispettiva categoria e consentire la modifica di tale categoria. Ecco il codice:

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

    protected DataTable tableCategorie;

    DataTable  getCategorie () {

        string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
        OleDbConnection cnn = new OleDbConnection(strCnn) ;

        DataSet ds = new DataSet ();

        OleDbCommand cmd = new OleDbCommand ("SELECT idcategoria, nomecategoria FROM categorie" , cnn);

        OleDbDataAdapter da = new OleDbDataAdapter();

        da.SelectCommand = cmd;

            cnn.Open();
          da.Fill(ds, "categorie");
        cnn.Close();

        return ds.Tables["categorie"];
    }


    int getIndiceCategoria (int idCategoria) {

            int rip=0;

            foreach (DataRow myDataRow in tableCategorie.Rows) {


                if ( (int)myDataRow["idCategoria"]== idCategoria ) return rip;
                rip++;
            }

            return 1;
    }


    void bindGrid () {

        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 IDProdotto, nomeprodotto, categorie.idcategoria, nomecategoria FROM prodotti INNER JOIN categorie ON prodotti.IDCategoria=categorie.IDCategoria ORDER BY prodotti.idprodotto" , cnn);
        cnn.Open();

        dGrid.DataSource= cmd.ExecuteReader(CommandBehavior.CloseConnection);
        dGrid.DataBind();

        cnn.Close();
    }


    void dGrid_edit (object sender, DataGridCommandEventArgs e) {

        dGrid.EditItemIndex = e.Item.ItemIndex;
        bindGrid();

    }

    void dGrid_delete (object sender, DataGridCommandEventArgs e) {

        int idProdotto =  int.Parse ( e.Item.Cells[1].Text )  ;

        string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
        OleDbConnection cnn = new OleDbConnection(strCnn) ;
        OleDbCommand cmd = new OleDbCommand ("DELETE * FROM prodotti WHERE idprodotto=?", cnn);
          cmd.Parameters.Add(new OleDbParameter("@1", idProdotto));
        cnn.Open();
        cmd.ExecuteNonQuery();
        cnn.Close();

    }


    void dGrid_cancel (object sender, DataGridCommandEventArgs e) {

        dGrid.EditItemIndex=-1;
        bindGrid();
    }


    void dGrid_update (object sender, DataGridCommandEventArgs e) {

        int idProdotto =  int.Parse ( e.Item.Cells[1].Text )  ;
        int idCategoria = int.Parse ( ((DropDownList)e.Item.FindControl("dDLNomeCategoria")).SelectedValue );

        string strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:/ASPCODE/Northwind.mdb";
        OleDbConnection cnn = new OleDbConnection(strCnn) ;
        OleDbCommand cmd = new OleDbCommand ("UPDATE prodotti SET idcategoria=? WHERE idprodotto=?", cnn);
          cmd.Parameters.Add(new OleDbParameter("@1", idCategoria));
          cmd.Parameters.Add(new OleDbParameter("@2", idProdotto));
        cnn.Open();
        cmd.ExecuteNonQuery();
        cnn.Close();

        dGrid.EditItemIndex=-1;
        bindGrid();
    }



    void Page_Init () {

      tableCategorie = getCategorie();
    }

    void Page_Load () {

        if (!Page.IsPostBack) bindGrid();

    }

</script>

<html>

<body topmargin=0 leftmargin=0>

    <form runat="server">

        <asp:datagrid cellpadding=4 id="dGrid" runat="server" width="100%" autogeneratecolumns="false" onDeleteCommand="dGrid_delete" onCancelCommand="dGrid_cancel" onUpdateCommand="dGrid_update" onEditCommand="dGrid_edit">
            <Columns>
                <asp:EditCommandColumn CancelText="annulla modifiche" UpdateText="OK" EditText="modifica record" />
                <asp:boundcolumn datafield="idprodotto" readonly="true" HeaderText="<b>IDprodotto</b>" />
                <asp:boundcolumn datafield="nomeprodotto" readonly="false" HeaderText="<b>NomeProdotto</b>" />
                <asp:templatecolumn  HeaderText="<b>NomeCategoria</b>" >
                    <itemtemplate>
                        <asp:label id="lblCatNome" text=<%#DataBinder.Eval (Container.DataItem, "nomecategoria") %>  runat="server" />
                    </itemtemplate>
                    <edititemtemplate>
                        <asp:dropdownlist id="dDLNomeCategoria" datasource=<%#tableCategorie%> datatextfield="nomecategoria"  datavaluefield="idcategoria" SelectedIndex=<%#getIndiceCategoria( (int)DataBinder.Eval (Container.DataItem, "idCategoria") )%> runat="server" />
                    </edititemtemplate>

                </asp:templatecolumn>
                <asp:buttoncolumn HeaderText="<b>Elimina categoria</b>" Text="elimina prodotto" CommandName="Delete" />
            </Columns>
        </asp:datagrid>

    </form>

</body>
</html>

La definizione del DataGrid prevede una prima colonna di tipo EditCommandColumn che visualizza un link 'modifica record' per ciascuna riga; la stessa colonna, una volta entrati in fase di editing, visualizzerà automaticamente i link per l'update e per l'annullamento delle modifiche. Le due colonne successive (IDProdotto readonly e NomeProdotto) sono di tipo boundcolumn, mentre la definizione della colonna categoria è diversa a seconda che ci si trovi in fase di visualizzazione (l'ItemTemplate) o in fase di editing (EditItemTemplate): in fase di visualizzazione troviamo una semplice label che visualizza il nome della categoria, mentre in fase di editing troviamo un dropdownlist che viene popolato con i nomi delle possibili categorie. L'ultima colonna è di tipo buttoncolumn e contiene un link per l'eliminazione del record.
I vari eventi (edit, update, cancel, delete) sono associati alle rispettive procedure come di consueto, con

onDeleteCommand="dGrid_delete" onCancelCommand="dGrid_cancel" onUpdateCommand="dGrid_update" onEditCommand="dGrid_edit"

Da notare che l'ultima colonna (per l'eliminazione) contiene inoltre la proprietà CommandName settata a delete; solo settandola in questo modo infatti viene generato l'evento OnDeleteCommand del datagrid alla pressione del link di cancellazione.

Procedendo con ordine, in Page_Init viene popolata la variabile protected con l'insieme delle categorie (vedremo tra poco quando entra in gioco tale variabile). Se non si tratta di un postback, si richiama bindGrid() che effettua il databinding del datagrid al risultato della query. Se si è in modalità di editing, vengono risolte inoltre le espressioni di databinding:

datasource=<%#tableCategorie%> datatextfield="nomecategoria"  datavaluefield="idcategoria" SelectedIndex=<%#getIndiceCategoria( (int)DataBinder.Eval (Container.DataItem, "idCategoria") )%>

contenuta nell'EditItemTemplate. La prima espressione di databinding specifica la sorgente dati per il dropdownlist (la variabile tableCategorie sopra definita); le due successive assegnazioni specificano i campi della sorgente dati, che saranno visualizzati e i rispettivi valori da assegnare a ciascuno di essi. La seconda espressione di databinding ricava, tramite la procedura getIndiceCategoria, la posizione della categoria corrente nell'insieme delle categorie e la assegna alla proprietà CurrentIndex in maniera che la categoria corrente appaia come selezionata durante l'editing.

La procedura dGrid_edit setta il datagrid in modalità di editing e richiama bindGrid per ripetere il databinding. Come si nota, per passare in modalità di editing, è sufficiente impostare:

dGrid.EditItemIndex = e.Item.ItemIndex

in cui il parametro e.Item.ItemIndex contiene l'indice della riga di cui è stato richiesto l'editing.

La procedura dGrid_cancel fa in modo semplicemente di uscire dalla alla modalità di editing senza apportare modifiche alla base di dati.

La procedura dGrid_update recupera l'IDProdotto da aggiornare attraverso il parametro e:

int idProdotto =  int.Parse ( e.Item.Cells[1].Text )  ;

e.Item.Cells[1] fa riferimento infatti al contenuto della seconda colonna (bound column). Per risalire invece all'IDCategoria selezionato dal dropdownlist delle categorie, si usa il consueto metodo FindControl:

int idCategoria = int.Parse ( ((DropDownList)e.Item.FindControl("dDLNomeCategoria")).SelectedValue );

Infine la procedura dGrid_delete ricava l'ID del record da eliminare come visto per l'editing e apporta naturalmente le modifiche alla base di dati (notare che l'operazione di eliminazione in esempio non darà buon esito poiché si tenta di eliminare un campo collegato con chiavi esterne ad altra tabella).




Utenti connessi: 9145