none
Abilitare NavigateUrl in Hyperlink su GridView se in DDL il valore è selezionato RRS feed

  • Domanda

  • Abilitare NavigateUrl in Hyperlink su GridView se in DDL il valore è selezionato

    Ciao a tutti.

    Ho uno strano problema con il comportamento di un evento NavigateUrl previsto in un tag HyperLink associato ad una GridView.

    In sostanza ho previsto due DropDownList -esterne alla GridView- che sono popolate da una serie di date, una contiene le date di partenza, l'altra le date di arrivo.

    Nella GridView al tag HyperLink visualizzo quelle che sono le disponibilità numeriche per l'intervallo date selezionato.

    La mia necessità è quella di rendere attivo l'evento NavigateUrl nel tag HyperLink quando entrambe le date sono state selezionate nelle due DDL e rimandare l'utente ad una pagina di dettaglio.

    Ho inserito in DataFine_SelectedIndexChanged questo evento, ma NavigateUrl nell' HyperLink rimane sempre disabilitato, perchè?

    Cosa sbaglio?

    Grazie in anticipo per l'aiuto.

        protected void DataFine_SelectedIndexChanged(object sender, EventArgs e)
        { 
                foreach (GridViewRow row in GridView1.Rows)
                {
                    HyperLink Items = row.FindControl("Items") as HyperLink;
    
                    if (DataInizio.SelectedItem.Value == "0" || DataFine.SelectedItem.Value == "0")
                    {
                        Items.NavigateUrl = ""; 
                    }
                    else
                    {
                        Items.NavigateUrl = string.Format("Dettaglio.aspx?di={1}&df={2}", DataInizio.SelectedValue, DataFine.SelectedValue));
                    }
                }
    
                GridView1.DataBind();
                GridViewBind();
            }
        }

    .aspx

                            <asp:TemplateField HeaderText="Items">
                                <ItemTemplate>
                                    <asp:HyperLink ID="Items" runat="server" Text='<%# Eval("Items") %>' ToolTip='<%# Eval("Items") %>'>
                                    </asp:HyperLink>
                                </ItemTemplate>
                            </asp:TemplateField>
                    <asp:DropDownList ID="DataFine" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DataFine_SelectedIndexChanged"
                        CssClass="ddl_Class">
                        <asp:ListItem Text="-------" Value=""></asp:ListItem>
                    </asp:DropDownList>



    • Modificato cms9651 venerdì 15 maggio 2015 14:31
    venerdì 15 maggio 2015 14:24

Risposte

  • Ok

    Però devi togliere il ciclo for each all'interno del Rowdatabound perchè è inutile:

    Lasciando il ciclo per ogni riga della griglia lui va a cambiare lo stato di tutte le righe

    Ciao


    Luca Congiu (congiuluc)
    Community Leader: www.dotnetcode.it
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà; altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    • Contrassegnato come risposta cms9651 lunedì 18 maggio 2015 13:44
    lunedì 18 maggio 2015 13:16
    Moderatore

Tutte le risposte

  • Prova a commentare il/i databind che esegui alla fine della DataFine_SelectedIndexChanged.

    Ciao


    Luca Congiu (congiuluc)
    Community Leader: www.dotnetcode.it
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà; altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    • Proposto come risposta Paolo Pranzo venerdì 15 maggio 2015 18:15
    venerdì 15 maggio 2015 14:44
    Moderatore
  • Grazie, ho fatto come hai suggerito ma in questo modo la GridView non si aggiorna secondo il periodo selezionato delle due DDL data arrivo e data partenza, rimangono infatti visualizzati nella GV i dati della data arrivo ...
    lunedì 18 maggio 2015 12:40
  • Prova a rieseguire il databind della griglia ed impostare

    la proprietà navigateUrl nell'evento RowDatabound

    Ciao


    Luca Congiu (congiuluc)
    Community Leader: www.dotnetcode.it
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà; altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    lunedì 18 maggio 2015 12:44
    Moderatore
  • Grazie.

    Questo è il codice .cs in questione, con impostazione della proprietà navigateUrl nell'evento RowDatabound.

    Adesso la proprietà navigateUrl è sempre linkabile anche quando è stata selezionata soltanto la data arrivo nella DDL data inizio che popola la GV.

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                foreach (GridViewRow row in GridView1.Rows)
                {
                    HyperLink Items = row.FindControl("Items") as HyperLink;
    
                    if (DataFine.SelectedItem.Value == "0")
                    {
                        Items.NavigateUrl = ""; 
                    }
                    else
                    {
                        Items.NavigateUrl = string.Format("Dettaglio.aspx?di={1}&df={2}", DataInizio.SelectedValue, DataFine.SelectedValue));
                    }
                }
            }
        }
    
    
    
        protected void DataFine_SelectedIndexChanged(object sender, EventArgs e)
        {       
            string myDateTimeStringFine;
            myDateTimeStringFine = DataFine.SelectedValue;
            DateTime dtFine;
            dtFine = Convert.ToDateTime(myDateTimeStringFine);
    
            string myDateTimeStringInizio;
            myDateTimeStringInizio = DataInizio.SelectedValue;
            DateTime dtInizio;
            dtInizio = Convert.ToDateTime(myDateTimeStringInizio);
    
            if (dtFine <= dtInizio)
            {
                DataFine.SelectedIndex = 0;
                Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert", "alert('La data fine deve essere sempre successiva a data inizio.');window.location='Default.aspx';", true);
            }
            else
            {
                GridViewBind();
            }
        }
    
        protected void DataInizio_SelectedIndexChanged(object sender, EventArgs e)
        {
            DataFine.Enabled = true;
            GridViewBind();
        }


    • Modificato cms9651 lunedì 18 maggio 2015 13:02
    lunedì 18 maggio 2015 13:01
  • Ok

    Però devi togliere il ciclo for each all'interno del Rowdatabound perchè è inutile:

    Lasciando il ciclo per ogni riga della griglia lui va a cambiare lo stato di tutte le righe

    Ciao


    Luca Congiu (congiuluc)
    Community Leader: www.dotnetcode.it
    Personal Blog: blogs.dotnetcode.it

    Se hai trovato la soluzione all'interno del Forum, ricorda di segnalare il post come risposta, in alternativa puoi postare la soluzione da te adottata. Questo aiuterà; altri utenti, che hanno riscontrato la stessa problematica, ad identificare rapidamente la soluzione/risposta corretta.

    • Contrassegnato come risposta cms9651 lunedì 18 maggio 2015 13:44
    lunedì 18 maggio 2015 13:16
    Moderatore
  • Ok, grazie però continua ad abilitare NavigateUrl in Hyperlink anche quando Data fine non è stata selezionata.

     protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
             HyperLink Items = row.FindControl("Items") as HyperLink;
    
                    if (DataFine.SelectedItem.Value == "0")
                    {
                        Items.NavigateUrl = ""; 
                    }
                    else
                    {
                        Items.NavigateUrl = string.Format("Dettaglio.aspx?di={1}&df={2}", DataInizio.SelectedValue, DataFine.SelectedValue));
                    }
                }
        }

    lunedì 18 maggio 2015 13:19
  • Grazie, risolto... così funziona correttamente...

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
             HyperLink Items = row.FindControl("Items") as HyperLink;
    
                    if (DataFine.SelectedIndex == 0)
                    {
                        Items.NavigateUrl = ""; 
                    }
                    else
                    {
                        Items.NavigateUrl = string.Format("Dettaglio.aspx?di={1}&df={2}", DataInizio.SelectedValue, DataFine.SelectedValue));
                    }
                }
        }

    • Modificato cms9651 lunedì 18 maggio 2015 13:49
    lunedì 18 maggio 2015 13:44