+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: Gestione dell aggiornamento e dell'eliminazione con controllo DetailsView

  1. #1
    sanfra non è in linea Scolaretto
    Post
    373

    Gestione dell aggiornamento e dell'eliminazione con controllo DetailsView

    Salve, ho un controllo detailsview dove ho implementato gli eventi OnItemUpdating e OnItemDeleting e quando vado a fare modifica mi dà l'errore che devo implementare l'evento ModeChanging, mentre se faccio Elimina mi dà l'errore sulla chiave e.keys dell'evento dicendomi:Riferimento a un oggetto non impostato su un'istanza di oggetto;


    Di seguito inserisco il codice del detailsview:

    codice:
    <asp:DetailsView ID="dvsearchdata" runat="server" Height="50px" Width="682px" CellPadding="4"
            ForeColor="#333333" GridLines="Horizontal" DataKeyNames="idcliente" AllowPaging="True"
            HeaderText="Scheda Cliente" OnItemUpdating="dvsearchdata_ItemUpdating" OnItemDeleting="dvsearchdata_ItemDeleting">
            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <CommandRowStyle BackColor="#E2DED6" Font-Bold="True" />
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <FieldHeaderStyle BackColor="#E9ECF1" Font-Bold="True" />
            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <EditRowStyle BackColor="#999999" />
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
            <EmptyDataTemplate>
                Non ci sono Cliente per questa data di ritiro
            </EmptyDataTemplate>
            <Fields>
                <asp:CommandField ShowEditButton="true" />
                <asp:TemplateField ShowHeader="false">
                    <ItemTemplate>
                        <asp:LinkButton ID="lbdelete" runat="server" CausesValidation="False" CommandName="Delete"
                            Text="Elimina" OnClientClick="javascript:return confirm('Cancellare il cliente?');" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Fields>
        </asp:DetailsView>
    il codice che sto implementando:

    codice:
     protected void dvsearchdata_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
        {
    
            Cliente cliente_1 = Cliente.SearchClientId(int.Parse(e.Keys["idcliente"].ToString()));
    
            cliente_1.nome = e.NewValues["nome"].ToString();
            cliente_1.cognome = e.NewValues["cognome"].ToString();
            cliente_1.indirizzo = e.NewValues["indirizzo"].ToString();
            cliente_1.telefono = e.NewValues["telefono"].ToString();
            cliente_1.email = e.NewValues["email"].ToString();
            cliente_1.dataInserimento = DateTime.Parse(e.NewValues["dataInserimento"].ToString());
            cliente_1.dataritiro = DateTime.Parse(e.NewValues["dataritiro"].ToString());
            cliente_1.descrizione = e.NewValues["descrizione"].ToString();
            cliente_1.evaso = Boolean.Parse(e.NewValues["Evaso"].ToString());
            cliente_1.lavorazione = Boolean.Parse(e.NewValues["Lavorazione"].ToString());
            cliente_1.prestazione.prestazione = e.NewValues["prestazione"].ToString();
            cliente_1.prestazione._modello = e.NewValues["modulo"].ToString();
    
    
            cliente_1.UpdateClienteId(cliente_1);
    
            e.Cancel = true;
    
            dvsearchdata.ChangeMode(DetailsViewMode.ReadOnly);
    
        }
        protected void dvsearchdata_ItemDeleting(object sender, DetailsViewDeleteEventArgs e)
        {
            
            //int id = int.Parse(e.Keys["idcliente"].ToString());
            int id = int.Parse(e.Keys["idcliente"].ToString());
            Cliente cli = new Cliente();
            cli.DeleteClienteId(id);
    
            e.Cancel=true;
    
            
        }

    Spero mi possiate aiutare.Grazie!

  2. #2
    L'avatar di SignIn
    SignIn non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,026
    Ciao sanfra,
    in questo caso (credo che in presenza di un DataSource questo non accade, ma non ho verificato), l'unico workaround che io posso darti è quello di modificare il property CommandName da delete a per esempio deleteCliente.
    A questo punto puoi gestire il tutto con l'evento ItemCommand.

  3. #3
    sanfra non è in linea Scolaretto
    Post
    373
    Ciao SignIn grazie per il tuo intervento, l'evento Delete sono riusciuto a gestirlo, però mi rimane da gestire sia l'evento Paging che l'evento ItemPudate.
    In effetti gestire queste situazioni con un Datasource(SQLDataSource o ObjectDataSource) è molto più semplice, anche perchè per creare un avento paging io dovrei creare una store con innestato anche la paginazione.

    Tu come mi consigli di gestire questa situazione visto le varie ricerche da implementare?

    Grazie

  4. #4
    L'avatar di SignIn
    SignIn non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,026
    Quote Originariamente inviato da sanfra Visualizza il messaggio
    Ciao SignIn grazie per il tuo intervento, l'evento Delete sono riusciuto a gestirlo
    Ciao sanfra,
    non ho capito se hai risolto in un altro modo o seguendo il mio consiglio.
    Personalmente io gestirei tutto da codice. Praticamente per l'update eliminerei il CommandField e aggiungerei altri due pulsanti oltre al delete:
    codice:
    <asp:LinkButton ID="lbEdit" runat="server" CommandName="editCliente" Text="Edit" />
    <asp:LinkButton ID="lbUpdate" runat="server" CommandName="updateCliente" Text="Update" Visible="false" />
    Sempre nell'evento ItemCommand come per il delete vado a verificare il valore:
    codice:
    protected void dvsearchdata_ItemCommand1(object sender, DetailsViewCommandEventArgs e)
    {
     if (e.CommandName.ToLower() == "editcliente")
     {
       dvsearchdata.ChangeMode(DetailsViewMode.Edit);
       //Bind
     }
     if (e.CommandName.ToLower() == "updatecliente")
     {
       //update
       dvsearchdata.ChangeMode(DetailsViewMode.ReadOnly);
       //Bind
     }
    }
    Ora non rimane che rendere visibile i linkbutton edit e update a seconda dei casi:
    codice:
    protected void Page_PreRender(object sender, EventArgs e)
    {
    LinkButton lbUpdate = (LinkButton)dvsearchdata.FindControl("lbUpdate");
    LinkButton lbEdit = (LinkButton)dvsearchdata.FindControl("lbEdit");
    if (dvsearchdata.CurrentMode == DetailsViewMode.Edit)
    {
      lbUpdate.Visible = true;
      lbEdit.Visible = !lbUpdate.Visible;
    }
    else if (dvsearchdata.CurrentMode == DetailsViewMode.ReadOnly)
    {
      lbUpdate.Visible = false;
      lbEdit.Visible = !lbUpdate.Visible;
    }
    }
    Probabilmente c'è anche un modo più elegante per gestire questo caso ma in questo momento non mi viene niente di meglio .
    Sinceramente per la paginazione con capisco dove sta il problema.

  5. #5
    sanfra non è in linea Scolaretto
    Post
    373
    Quindi tu gestiresti totalmente da codice in questo modo e in effetti sembrerebbe tutto molto più sempplice e lineare.Invece quello che volevo fare io, e non, so se sono riusciuto a farmi capire era di gestire da codice solamente l'objectdatasource(impostandogli i parametri e tutto il resto tramite in base alla query string) e da quanto ho visto è molto più complesso e disordinato.

    Quello che a questo punto vorrei chiederti è nell'ItemCommand, dentro gli if gli posso implementare il codice per aggiornare oppure per eliminare.Ti chiedo questo visto che questa procedra io non l' ho mai eseguita.


    Grazie ancora di tutto!

  6. #6
    L'avatar di SignIn
    SignIn non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,026
    Ciao sanfra,
    Se dei usare l'oggetto DataSource meglio se fai uso dell'ObjectDataSource invece del SqlDataSource.
    Se invece vuoi procedere nel modo indicato (a dir la verità non la definirei più lineare ) nell'evento ItemCommand puoi avere un bel switch con i casi da gestire.
    Puoi recuperare la chiave della riga mostrata:
    codice:
    string key = dvsearchdata.DataKey.Value.ToString();
    Per recuperare i valori puoi per esempio:
    codice:
    ((TextBox)dvsearchdata.Rows[1].Cells[1].Controls[0]).Text
    Questo significa che se la riga è composta nel seguente modo:
    IdUtente => Riga 0
    Descrizione => Riga 1
    edit/delete => Riga 2
    Recupero la riga contente la descrizione, la seconda cella che contiene il valore.
    Anche in questo caso ho delle preferenze. Io non amo settare il property Autogenerate a true.
    Giusto per farti un esempio veloce, se il markup del controllo diventa:
    codice:
    <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="682px" DataKeyNames="idcliente" AutoGenerateRows="false" 
            HeaderText="Scheda Cliente" OnItemCommand="dvsearchdata_ItemCommand1" AllowPaging="True" OnPageIndexChanging="dvsearchdata_PageIndexChanging">
            <EmptyDataTemplate>
                Non ci sono Cliente per questa data di ritiro
            </EmptyDataTemplate>
            <Fields>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Label ID="lbldesc" runat="server" Text='<%#Eval("Desc") %>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtDesc" runat="server" Text='<%#Eval("Desc") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
                <asp:TemplateField ShowHeader="False">
                    <ItemTemplate>
                        <asp:LinkButton ID="lbEdit" runat="server" CommandName="editCliente" Text="Edit" />
                        <asp:LinkButton ID="lbUpdate" runat="server" CommandName="updateCliente" Text="Update" Visible="false" />
                        <asp:LinkButton ID="lbdelete" runat="server" CommandName="deleteCliente" Text="Elimina"  />
                    </ItemTemplate>
                </asp:TemplateField>
            </Fields>
        </asp:DetailsView>
    Allora nell'evento per recupeare il valore della textbox txtDesc in caso di update posso fare:
    codice:
    string desc = ((TextBox)DetailsView1.FindControl("txtDesc")).Text;
    Ripeto secondo me è sicuramente più semplice dare in pasto un ObjectDataSource, altrimenti basta un pò di ingegno per arrivare allo stesso risultato.
    Spero di essere stato chiaro.

  7. #7
    sanfra non è in linea Scolaretto
    Post
    373
    Sei stato chiaro e infatti adesso proverò immediatamente questa soluzione, mentre io invece prima io facevo qualcosa di meno chiaro.


    Appena avrò fatto ti farò sapere.Comuqnue si sei stato chiaro.

    Se ho dei problemi ti troverò qui?

  8. #8
    sanfra non è in linea Scolaretto
    Post
    373
    Ciao ho preso in considerazione il tuo spunto, come prima accennavo, mi dà degli errori sia in questo punto:
    codice:
    protected void dvsearchdata_PreRender(object sender, EventArgs e)
        {
            LinkButton lbUpdate = (LinkButton)dvsearchdata.FindControl("lbUpdate");
            LinkButton lbEdit = (LinkButton)dvsearchdata.FindControl("lbEdit");
    
            if (dvsearchdata.CurrentMode == DetailsViewMode.Edit)
            {
                lbUpdate.Visible = true;
                lbEdit.Visible = !lbUpdate.Visible;
            }
           
    
    else if (dvsearchdata.CurrentMode == DetailsViewMode.ReadOnly)
            {
                lbUpdate.Visible = false;
                lbEdit.Visible = !lbUpdate.Visible;
            }
           
    
        }
    e più precisamente quando va a rendere visibile o no il linkbutton lbUpdate dicendomi "Riferimento a un oggetto non impostato su un'istanza di oggetto".


    e dopo anche sull'eliminazione mi chiede ancora di implementare l'evento OnItemDeleting.Ma, gestendo tutto da codice non doveva evitare quest'ultima richiesta?

    Grazie ancora e scusa la miaminsistenza, ma tranquillo che la uso anche quando programmo!

  9. #9
    L'avatar di SignIn
    SignIn non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,026
    Sicuramente hai lasciato qualcosa di troppo nel markup.
    Posta il markup.

  10. #10
    sanfra non è in linea Scolaretto
    Post
    373
    Si certamente, ti posto tutto il codice, intanto voglio vedere se sbattendoci ancora un pò la testa ci arrivo da solo, nel frattempo che tu mi dia un tuo giudizio:

    codice:
     string txt_ric = null;
        DateTime data;
        protected void Page_Load(object sender, EventArgs e)
        {
    
            if (!IsPostBack)
            {
                txt_ric = Request.QueryString["ricerca"].ToString();
    
                if (txt_ric.Trim() == "data")
                {
                    cl.Visible = true;
                    txtcognome.Visible = false;
                    btnricercacognome.Visible = false;
                    txtprestazione.Visible = false;
                    btnricercaprestazione.Visible = false;
                    lblmessaggio.Text = "Seleziona una data";
                }
    
                else if (txt_ric.Trim() == "cognome")
                {
    
    
                    cl.Visible = false;
                    txtcognome.Visible = true;
                    btnricercacognome.Visible = true;
                    txtprestazione.Visible = false;
                    btnricercaprestazione.Visible = false;
                    lblmessaggio.Text = "Inserisci il cognome per iniziare la ricerca";
                }
    
                else if (txt_ric.Trim() == "prestazione")
                {
                    cl.Visible = false;
                    txtcognome.Visible = false;
                    btnricercacognome.Visible = false;
                    txtprestazione.Visible = true;
                    btnricercaprestazione.Visible = true;
                    lblmessaggio.Text = "Inserisci la prestazione per iniziare la ricerca";
                }
            }
        }
    
    
    
    //seleziona data dal calendario
    
        protected void cl_SelectionChanged(object sender, EventArgs e)
        {
            Cliente cliente = new Cliente();
            data = DateTime.Parse(cl.SelectedDate.ToShortDateString());
            dvsearchdata.DataSource = cliente.RicercaClienteData(data);
            dvsearchdata.DataBind();
           
        }
    
       protected void dvsearchdata_ItemCommand(object sender, DetailsViewCommandEventArgs e)
        {
            if (e.CommandName.ToLower() == "delete")
            {
    
                string idkey = dvsearchdata.DataKey.Value.ToString();
    
                Cliente cliente = new Cliente();
                cliente.DeleteClienteId(idkey);
                dvsearchdata.DataBind();
    
            }
            if (e.CommandName.ToLower() == "editcliente")
            {
                dvsearchdata.ChangeMode(DetailsViewMode.Edit);
    
                dvsearchdata.DataBind();
            }
            if (e.CommandName.ToLower() == "updatecliente")
            {
                //update
                Cliente cl=new Cliente();
    
                cl.idcliente = int.Parse(((TextBox)dvsearchdata.FindControl("txtidcliente")).Text);
                dvsearchdata.ChangeMode(DetailsViewMode.ReadOnly);
                dvsearchdata.DataBind();
    
            }
    
        }
        protected void dvsearchdata_PreRender(object sender, EventArgs e)
        {
            LinkButton lbUpdate=(LinkButton)dvsearchdata.FindControl("lbUpdate");
            LinkButton lbEdit = (LinkButton)dvsearchdata.FindControl("lbEdit");
    
            if (dvsearchdata.CurrentMode == DetailsViewMode.Edit)
            {
                lbUpdate.Visible = true;
                lbEdit.Visible = !lbUpdate.Visible;
            }
            else if (dvsearchdata.CurrentMode == DetailsViewMode.ReadOnly)
            {
                lbUpdate.Visible = false;
                lbEdit.Visible = !lbUpdate.Visible;
            }
            
    
        }
    Comunque anticipo che mi sei stato di grande aiuto a capire qualcosa di importante per il proseguo del mio lavoro.

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi