Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    ASP.NET: "Cattura" del click su un campo hyperLink server-side

    Rieccomi. Intanto grazie a tutti. Sto vedendo crescere la mia prima applicazione in c# sullo schermo, e questo lo devo anche a tutte le persone di HTML.IT che hanno avuto la voglia e la pazienza di rispondere ai miei dubbi. Siete stati grandi. Dopo questa lecchinata...

    per motivi che ho spiegato in altri post, e che non è utile credo spiegare qui, sto costruendo solo attraverso codice lato server. Tra le altre cose ho ovviamente dovuto generare una gridview. Fin qui tutto bene. Bindata con sqldatasorce ecc, sono anche riuscito (incredibilmente) a creare una colonna hyperLink. ecco il codice:

    codice:
                HyperLinkField Hlf_Dettaglio = new HyperLinkField();
                Hlf_Dettaglio.DataNavigateUrlFormatString = "~/ToDoList.aspx?id={0}";
                Hlf_Dettaglio.DataTextFormatString = "-->";
                Hlf_Dettaglio.HeaderText = "Dettaglio";
                Hlf_Dettaglio.DataTextField = "KMovimenti";
                Hlf_Dettaglio.DataNavigateUrlFields = new string[] { "KMovimenti" };
    
               ...
     
               Gv_ToDoList.Columns.Add(Hlf_Dettaglio);
    strano ma vero, funziona pure lei.
    Il problema sorge quando tento di "catturare il click" sul link generato dalla colonna hyperLink. Mi serve per la gestione di un panel a comparsa (utilizzando il modal popup extender dell'ajax control toolkit). Per utilizzare questo controllo infatti mi serve l'id del controllo che gestisce la comparsa del panel:
    codice:
    Mpe_RicercaMovimenti.TargetControlID = "Btn_OpenPanel";
    // Dove Mpe_RicercaMovimenti è il mio ModalPopupExtender
    e l'evento click del campo dell'hyperlink per poter inserire l'azione di .Show(); :
    codice:
            protected void CampoHyperLink_Click(object sender, EventArgs e)
            {
                Mpe_RicercaMovimenti.Show();
            }
    ho provato a cercare on-line, anche su questo forum, ma non ho trovato nulla di utile. Tranne forse il terrore di dover usare un TemplateField o qualcosa del genere, che ho letto in giro essere forse più adatto.

    Grazie in anticipo a tutti.

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Infatti non credo sia la strada giusta.
    Ora non ho tempo di proseguire, ma fai un ultimo tentativo prima di abbandonare la HLF e passare ad un piu' semplice TemplateField in cui puoi mettere un controllo con un tuo ID.

    codice:
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    ButtonField Dettaglio = new ButtonField();                
                    Dettaglio.ButtonType = ButtonType.Link;
                    Dettaglio.HeaderText = "Opzioni";               
                    Dettaglio.DataTextField = "KMovimenti";
                    Dettaglio.CommandName = "cn_dettaglio";
    
                    Gv_ToDoList.Columns.Insert(0, Dettaglio);
                }
            }
    
            protected void gv_rowcommand(object sender, GridViewCommandEventArgs e)
            {
                if (e.CommandName == "cn_dettaglio")
                {
                    int index = Convert.ToInt32(e.CommandArgument);
                    GridViewRow row = gv.Rows[index];
    
                    LinkButton lb = new LinkButton();
                    lb = (LinkButton)row.Cells[1].Controls[0];
    
                    Response.Redirect("WebForm2.aspx?id=" + lb.Text);
    
                    // ... 
                }
            }
    ..impostando il _rowcommand alla tua grid. (attenzione, il <row.Cells[1]> è per la MIA...)

  3. #3
    esatto, come ti ha già detto il buon djciko, non è la strada giusta.
    Ma non perché lo stai facendo da codice, sarebbe identico anche se facessi da progettazione.
    I campi/controlli "field" non sono adatti a particolari personalizzazioni. Ogni volta che devi fare qualcosa di custom, tipo agganciare un ModalPopUp, devi utilizzare un template.

    Comunque io utilizzerei una cosa ancora diversa: uno script lato client.
    Del resto quel link deve solo far apparire la ModalPopUp se non ho capito male, allora perché scomodare il server, eseguire tutto il codice della pagina, per fare solo un .Show()?

    codice:
    <script>
            // Add click handlers for buttons to show and hide modal popup on pageLoad
            function pageLoad() {
                $addHandler($get("showModalPopupClientButton"), 'click', showModalPopupViaClient);
            }
    
            function showModalPopupViaClient(ev) {
                ev.preventDefault();
                var modalPopupBehavior = $find('programmaticModalPopupBehavior');
                modalPopupBehavior.show();
            }
    </script>
    showModalPopupClientButton - è l'ID del tuo link
    programmaticModalPopupBehavior - è l'ID che hai dato per la proprietà BehaviorID del modalPopUpExtender.

  4. #4
    grazie mille ragazzi. Non so perchè ma ho il rifiuto dei templatefield. Forse perchè sto mettendo troppa carne al fuoco (niubbissimo con c#) e mi sono autoconvinto che i TF siano difficiliiiiiiiiiissimi.

    Cmq, ho provato a implementare la soluzione di djciko con qualche modifica, e funziona. Alla fine infatti ho optato per un imagebutton.
    codice:
                ButtonField Btn_DettaglioLink = new ButtonField();
                Btn_DettaglioLink.ButtonType = ButtonType.Image;
                Btn_DettaglioLink.HeaderText = "dettaglio";
                Btn_DettaglioLink.DataTextField = "KMovimenti";
                Btn_DettaglioLink.ImageUrl = "~/Resources/Images/dettaglio.png";
                Btn_DettaglioLink.CommandName = "cmdVisualizzaDettaglio";
    ho creato quindi il rowcommand:
    codice:
    Gv_ToDoList.RowCommand += new GridViewCommandEventHandler(Gv_ToDoList_RowCommand);
    e l'ho implementato:
    codice:
    protected void Gv_ToDoList_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
        if (e.CommandName == "cmdVisualizzaDettaglio") 
        { 
            Response.Redirect("ToDoList.aspx?id=" + e.CommandArgument);
            Mpe_RicercaMovimenti.Show();
         } 
    }
    alla fine infatti mi è stato sufficiente passare l'id all'url e associare lo Show().
    Certo, levando tutte quelle righe ovviamente adesso ho il terrore che sia troppo semplice il mio codice, e che manchi qualcosa di essenziale!!!

    C'è anche un altro problema: se faccio il redirect ovviamente mi refrescia la pagina. Questo vuol dire che il mio modalpanel non arriva ad aprirsi. Pensavo di optare per un hiddenfield, da valorizzare con l'id, invece del redirect. Che ne pensate?

  5. #5
    ma perché metti il redirect ad un'altra pagina?
    non hai detto che dovevi fare apparire un moldalPopUp?

    Ricominciamo:
    - cosa deve fare il pulsante?
    - cosa deve vedere l'utente?

  6. #6
    Il redirect lo faccio alla stessa pagina. ToDoList.aspx è la pagina corrente. Non so se cambi qualcosa il fatto che tutto il codice che ho scritto è in relatà contenuto in un web user control inserito all'interno appunto di ToDoList.aspx.

  7. #7
    Argh. Ho anche detto un'altra cavolata. il valore che apassavo all'url non era quello corretto. Il problema è che con un imagebutton non riesco a implementare le righe che djciko mi ha scritto:

    codice:
    LinkButton lb = new LinkButton();
     lb = (LinkButton)row.Cells[1].Controls[0];
    in realtà non so nemmeno cosa faccia la seconda riga. O meglio so che passa il valore che mi serve scorrendo credo la gridview, ma non so come lo faccia... Scusate, sono un disastro.

    dovrebbe essere qualcosa del genere, penso, ma ovviamente non così:
    codice:
    if (e.CommandName == "cmdVisualizzaDettaglio") 
    { 
        int index = Convert.ToInt32(e.CommandArgument); 
        GridViewRow row = Gv_ToDoList.Rows[index]; 
        ImageButton Btn_DettaglioLink = new ImageButton(); 
        Btn_DettaglioLink = (ImageButton)row.Cells[0].Controls[11];
        Response.Redirect("ToDoList.aspx?id=" + Btn_DettaglioLink.ToString()); 
    
        Mpe_DettaglioMovimenti.Show(); 
    }
    giustamente, infatti, un imagebutton non ha il .Text

  8. #8
    Scusate, ce l''ho fatta. La prox volta farò qualche tentativo in più prima di scrivere che non riesco. Scusate!

    codice:
    protected void Gv_ToDoList_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
       if (e.CommandName == "cmdVisualizzaDettaglio") 
       { 
          int index = Convert.ToInt32(e.CommandArgument); 
          GridViewRow row = Gv_ToDoList.Rows[index]; 
          ImageButton Btn_DettaglioLink = new ImageButton(); 
          Btn_DettaglioLink = (ImageButton)row.Cells[11].Controls[0]; 
    
          Response.Redirect("ToDoList.aspx?id=" + Btn_DettaglioLink.AlternateText); 
    
          Mpe_DettaglioMovimenti.Show(); 
        } 
    }
    Ho usato l' AlternativeText. Resta la questione redirect.

  9. #9
    Sì sì, smanettando ho capito cosa fa. Non mi è tanto chiara la sintassi di (LinkButton)row. Quella parentesi con dentro un controllo. Ma mi documento su internet.

  10. #10
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    codice:
    LinkButton lb = new LinkButton();
     lb = (LinkButton)row.Cells[1].Controls[0];
    questo non fa altro che, una volta premuto un comando (il link in questo caso) andare alla cella 1 e prendere il primo controllo, mettendolo nel Linkbutton istanziato, per poi usarne il Text.

    Avevi fatto anche l'errore di prendere il <controllo> 11, invece di puntare alla 12ma <colonna>.


    Comunque, non confondere l'evento _RowDataBound, che è un ciclo che passa su tutte le righe una volta che le ha legate (bind) al valore del DB con _RowCommand. Questo è l'evento che prende UN comando dato alla griglia

    PS: E ricordati che <e.CommandArgument> nel RowCommand contiene L'INDICE DELLA RIGA, non l'ID del record !

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.