Home / Programmazione / C# - Asp.NET / Sostituire valori GridView e DropDownList con voci Web.config
Mattepuffo

Sostituire valori GridView e DropDownList con voci Web.config

Sostituire valori GridView e DropDownList con voci Web.config

Lo scenario è questo: ho una GridView e una DropDownList che prendo dei valori da una tabella che ha solo valori numerici (2, 4, 6, ecc), dove ogni valore corrisponde a uno stato (pausa, da trasferire, ecc).

Gli stati non salvati da nessuna parte e io devo rappresentare gli stati al posto del valore perchè ovviamente più leggibili.

Ovviamente non posso modificare il database (sarebbe stato troppo facile).

I modi sono:

  • usare una query che ogni volta trasforma il numero in stato
  • cambiare i valori prendendoli da quelli impostati a mano nel Web.config

La prima strada è più facile ma ha degli svantaggi: se vengono cambiati gli stati devi cambiare la query; inoltre la query è anche più lenta.

Quindi ho proceduto col secondo metodo, e vi spigherò come ho fatto.

Prima di tutto dobbiamo aggiungere i nostri valori nel Web.config (il file di configurazione dei siti Asp.NET):

<appSettings>
<add key="0" value="DA PROCESSARE"/>
<add key="1" value="1 NON LO SO"/>
<add key="2" value="TRASFERITO"/>
<add key="3" value="ERRORE"/>
<add key="4" value="TRASFERITO"/>
<add key="6" value="6 NON LO SO"/>
<add key="7" value="7 NON LO SO"/>
<add key="30" value="PAUSA"/>
</appSettings>

Qui decidiamo ogni numero a che stato corrisponde.

 

E' facile intuire la velocità con cui si possono apportare modifiche rispetto alla query.

Il secondo step è creare una classe nel cartella App_Code in modo che sia raggiungibile da tutte le pagine:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;

namespace Telenews
{
public class StatoCiao
{
public string recuperaStato(string parametro)
{
return System.Configuration.ConfigurationManager.AppSettings[parametro];
}
}
}

In pratica non facciamo altro che andare a prendere i valori impostati prima.

A questo punto nel code behind della pagina scriviamo un metodo che richiama quella classe (forse questo metodo si potrebbe scrivere direttamente nella Master se l'avete, ma non ho provato):

protected string Recupera(object par)
{
if (par != null)
{
StatoCiao st = new StatoCiao();
return st.recuperaStato(par.ToString());
}
return string.Empty;
}

L'unica cosa da notare è che al metodo passiamo un object generico che poi convertiamo a stringa con ToString().

A questo punto possiamo analizzare i due controlli server (vi riporto solo le info utili).

Cominciamo dalla DDL.

<asp:DropDownList ID="DropDownList" runat="server" DataSourceID="SqlDataSource"
DataValueField="stato" DataTextField="stato" OnDataBound="RowDataBound">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:MYTELENEWS %>"
SelectCommand="SELECT DISTINCT stato FROM [files_deploy]"></asp:SqlDataSource>

Come vedete c'è un evento OnDataBound; questo evento lo scriviamo nel code behind della pagina:

protected void RowDataBound(object sender, EventArgs e)
{
for (Int32 i = 1; i <= DropDownList6.Items.Count - 1; i++)
{
DropDownList6.Items[i].Text = Recupera(DropDownList6.Items[i].Text);
}
}

Scandiagliamo tutti gli elementi della DDL e per tutti gli elementi richiamiamo il metodo Recupera scritto sopra.

Per la GV usiamo un altro modo:

<asp:GridView ID="GV" runat="server" AllowPaging="True" DataSourceID="SqlDataSource">
<Columns>
<asp:BoundField DataField="stato" HeaderText="stato" SortExpression="stato" />
<asp:TemplateField>
<ItemTemplate>
<asp:Label runat="server" ID="lblDescrizioneStato" Text='<%# Recupera(Eval("stato")) %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

(Vi ricordo che ho levato tutto ciò che non serve, in questo caso anche l'SqlDataSource).

In pratica qui ho due colonne: una rappresenta il campo stato del db, l'altra è una Label nella quale facciamo la trasformazione.

La trasformazione la attuiamo richiamando il metodo Recupera con una espressione inline, richiamando dentro Eval() il nome del campo.

"Tutto qua"!

Spero possa essere d'aiuto a qualcuno perchè tutto ciò in rete non si trova.

 

EDIT:

Faccio una precisazione sulla DDL.

Io ho usato quel ciclo perchè ho aggiunto un Item * a mano ed ho usato l'AppendDataBoundItems.

Ho rifatto la DDL usando solo il code-behind levando l'AppendDataBoundItems:

protected void ddlStatoSource()
{
SqlDataAdapter adapter = new SqlDataAdapter("SELECT DISTINCT stato FROM files_deploy_siti", conn);
try
{
conn.Open();
DataSet ds = new DataSet();
adapter.Fill(ds);
ddlStato.AutoPostBack = true;
ddlStato.DataSource = ds;
ddlStato.DataValueField = "stato";
ddlStato.DataTextField = "stato";
ddlStato.DataBind();
ddlStato.Items.Insert(0, new ListItem("*", "*"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
conn.Close();
}
}

A questo punto potete usare qust'altro ciclo nel RowDataBound:

protected void RowDataBound(object sender, EventArgs e)
{
foreach (ListItem i in ddlStato.Items)
{
i.Text = Recupera(i.Text);
}
}

In pratica usiamo un foreach.