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

    Modificare valore colonna gridview con valore web.config

    devo modificare da codice il valore di una colonna di una gridview.
    per ora ho fatto cosi.
    -aggiunto queste righe al web.config:
    codice:
      <appSettings>
        <add key="0" value="DA PROCESSARE"/>
        <add key="1" value="NON LO SO"/>
        <add key="2" value="TRASFERITO"/>
        <add key="3" value="ERRORE"/>
        <add key="4" value="TRASFERITO"/>
        <add key="30" value="PAUSA"/>
      </appSettings>
    -creato una classe con un metodo per recuperare i valori:
    codice:
        public class Stato
        {
            private static Configuration config = null;
            public static string recuperaStato(string parametro)
            {
                return config.AppSettings.Settings[parametro].Value;
            }
        }
    -creato un evento RowDataBound nella gridview:
    codice:
            protected void RowDataBound(object sender, EventArgs e)
            {
                string stato = Stato.recuperaStato("");
            }
    qua io dovrei recuperare i valori delle righe di quella colonna e poi modificarli con quelli presi dal web.config.
    come faccio a recuperare i valori dalla GV??

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    120
    Do' per scontato che tu conosca il numero della colonna, mettiamo la 5
    A questo punto ti basterà

    codice:
    protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
    {
    	string tempVal = System.Configuration.ConfigurationManager.AppSettings(e.Row.Cells[5].Text);
    	if (!string.IsNullOrEmpty(tempVal))
    		e.Row.Cells[5].Text = tempVal;
    }
    Indubbiamente migliore sarebbe intervenire prima, direttamente sulla query ( popolando ad esempio una tabellina di raccordo con cui ottenere direttamente le voci in forma parlante ).

    Un'alternativa, se stai evitando l'AutoGenerateColumns ( SEMPRE AUSPICABILE!!! ) potresti usare una colonna template siffatta
    codice:
          <asp:TemplateField>
            <ItemTemplate>
              <%#System.Configuration.ConfigurationManager.AppSettings(Eval("Stato"))%>
            </ItemTemplate>
          </asp:TemplateField>
    Spero di esserti stato utile

  3. #3
    ciao!!
    allora, se potessi fare dql sql sarebbe molto più facile ma purtroppo nn posso .
    detto ciò, si sto evitando l'AutoGenerateColumns!!

    ho provato con il tuo evento modificato così perchè dava errore:
    codice:
    string tempVal = System.Configuration.ConfigurationManager.AppSettings[e.Row.Cells[5].Text];
    (parentesi quadre dopo AppSettings).
    però nn ho capito tempVal che sarebbe.

    nel secondo modo invece nn ho ben capito che sarebbe la stringa "Stato".

    scuse ma su alcune cose trovo un pò di difficoltà in quanto sto dovendo imparare molto in fretta

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    120
    allora, premesso che sviluppo VB e quindi ( per facilitarti ) ho fatto passare il codice di test da un convertitore automatico ( da lì le ( al posto delle [ che hai trovato), la tempVal l'ho creata per effettuare il test sul fatto che ci sia mapping tra il valore numerico e la stringa. In questo modo se lo stato fosse 99 ( non mappato ) anziché la stringa vuota in tabella resterebbe cmq un dato ( che aiuterebbe a capire eventuali stati non mappati ). Avrersti benissimo potuto evitare la variabile tempVal


    codice:
    	if (!string.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings(e.Row.Cells[5].Text)))
    		e.Row.Cells[5].Text = System.Configuration.ConfigurationManager.AppSettings(e.Row.Cells[5].Text);;

    ma avresti acceduto 2 volte al configurationManager, in questo modo la tempVal mi fa da Buffer tra il test e la successiva assegnazione.

    La stringa "Stato" è il valore che normalmente metti in DataField, quindi il nome del campo o della proprietà che vuoi usare in quella colonna. Ovviamente Se in una normale BoudColumn puoi solo indicare il campo ( e quindi un singolo valore testule ) in una template hai accesso a tutta la riga ( basta usare la proprietà Eval ) nonché puoi scrivere l'HTML o l'ASPX che vuoi

  5. #5
    alla fine ho risolto così (prendendo il codice da un altro sito dell'ufficio).
    ho modificato la classe Stato così (il nome della classe è a caso tanto per cambiarlo):
    codice:
        public class StatoCiao
        {
            public string recuperaStato(string parametro)
            {
                return System.Configuration.ConfigurationManager.AppSettings[parametro];
            }
        }
    nel code behind della pagina:
    codice:
            protected string Recupera(object par)
            {
                if (par != null)
                {
                    StatoCiao st = new StatoCiao();
                    return st.recuperaStato(par.ToString());
                }
                return string.Empty;
            }
    nella GV:
    codice:
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Label runat="server" ID="lblDescrizioneStato" Text='<%# Recupera(Eval("stato")) %>' />
                        </ItemTemplate>
                    </asp:TemplateField>
    per la ddl come potrei fare???

  6. #6
    ho provato così:
    codice:
                    <asp:DropDownList ID="DropDownList6" runat="server" DataSourceID="SqlDataSource5"
                        DataValueField="stato" AppendDataBoundItems="True" AutoPostBack="True" DataTextField='<%# Recupera(Eval("stato")) %>'>
                        <asp:ListItem Selected="True" Value="0">*</asp:ListItem>
                    </asp:DropDownList>
    mi da questo errore:
    Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

    ho anche provato mettendo DataBind.Eval:
    Compilation Error
    Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

    Compiler Error Message: CS0119: 'System.Web.UI.Control.DataBind()' is a 'method', which is not valid in the given context

    e levando del tutto Eval, in debug mi da:
    An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

    qualcuno ha qualche idea??

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    120
    la sintassi <%# Eval(...) %> funziona solo all'interno della definizione di ItemTemplate, che non è prevista per una DDL

    Prova così ( ti posto in VB per far prima )

    codice:
      Protected Sub DropDownList1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles DropDownList1.DataBound
        For Each i As ListItem In DropDownList1.Items
          i.Text = Recupera(i.Text)
        Next
      End Sub

  8. #8
    traduco in c#
    codice:
            protected void RowDataBound(object sender, EventArgs e)
            {
                foreach(ListItem i in DropDownList6.Items)
                {
                    i.Text = Recupera(i.Text);
                }
            }
    questo metodo lo richiamo nell'evento DataBound della ddl.
    diciamo che funziona quasi alla perfezione, ha solo un piccolo fastidio.
    in pratica io avevo aggiunto all'inizio dell'elenco una voce a mano:
    codice:
    <asp:ListItem Selected="True" Value="0">*</asp:ListItem>
    attivando l'AppendDataBoundItems.
    adesso il primo valore è 0!!
    pensi possa dipendere dall'evento che richiamo??

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    120
    Allora cambia il ciclo in
    codice:
    for (Int32 i = 1; i <= DropDownList1.Items.Count - 1; i++) {
    	DropDownList1.Items(i).Text = Recupera(DropDownList1.Items(i).Text);
    }
    così salta il primo elemento

  10. #10
    Originariamente inviato da giando877
    Allora cambia il ciclo in
    codice:
    for (Int32 i = 1; i <= DropDownList1.Items.Count - 1; i++) {
    	DropDownList1.Items(i).Text = Recupera(DropDownList1.Items(i).Text);
    }
    così salta il primo elemento
    guarda in verità basta:
    i <= DropDownList1.Items.Count

    cod completo:
    codice:
            protected void RowDataBound(object sender, EventArgs e)
            {
                for (Int32 i = 1; i <= DropDownList1.Items.Count; i++)
                {
                    DropDownList6.Items[i].Text = Recupera(DropDownList6.Items[i].Text);
                }
            }
    grazie mille!!!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.