Riempire DropDownList da SQL

Mattepuffo's logo
Riempire DropDownList da SQL

Riempire DropDownList da SQL

Sulla scia dell'articolo di questo, in cui spiego come riempire una JComboBox cone dati presi da db, ho deciso di scrivere una guida per la "gemella" DropDownList di Asp.NET.

Tenendo in considerazione che qua come db uso SQL Server e come linguaggio il C#.

Lo scenario però è lo stesso, quindi dategli una letta.

Riassumendo voglio rimepire la DDL con dati presi dalla tabella autori che ha solo due campi:

  • author_id (int)
  • author_name (string)

DropDownList è uno dei controll Web più utilizzati.

Da Visual Studio è facile riempirli, ma preferisco usare il code-behind.

La procedura però è molto più veloce in quanto il framework mette a disposizione i metodi per scegliere il valore della DDL e cosa viene rappresentato.

Prima di tutto aggiungiamo una DDL alla pagina:

<asp:DropDownList ID="ddlAuthor" runat="server">
</asp:DropDownList>

Sulla pagina non faremo nient'altro, quindi spostiamoci nel code-behind.

 

Subito prima del metodo Page_Load istanziamo la connessione:

SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MYCONN"].ConnectionString);

Ricordatevi di agiungere il namespace:

using System.Data.SqlClient;

Nel mio caso ho usato la stringa di connessione impostata nel Web.config.

Ve la posto come esempio ma non spiegherò come funziona:

<add name="MYCONN" connectionString="Data Source=indirizzo_ip;Initial Catalog=MYDB;Persist Security Info=True;User ID=user;Password=pass" providerName="System.Data.SqlClient"/>

Fatto ciò dobbiamo creare un metodo che aggiunga le voci alla DDL:

protected void ddlAuthorSource()
{
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM author", conn);
try
{
conn.Open();
DataSet ds = new DataSet();
adapter.Fill(ds);
ddlAuthor.DataSource = ds;
ddlAuthor.DataValueField = "author_id";
ddlAuthor.DataTextField = "author_name";
ddlAuthor.DataBind();
ddlAuthor.Items.Insert(0, new ListItem("*", "0"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
conn.Close();
}
}

Usiamo SqlDataAdapter per eseguire un comando (la query) da inviare al DataSet.

Apriamo la connessione, estrapoliamo i dati con un DataSet, e riempiamo il SqlDataAdapter con il medtodo Fill().

Poi seguono le varie impostazioni della DDL.

Come DataSource gli diamo il DataSet in modo che vengia riempita con i valori della tabella interrogata.

DataValueField è il campo che fornisce il valore all'elemento.

Io gli ho impostato l'id.

In DataTextField viene impostato il campo che fornisce il testo dell'elemento, cioà quello che viene visualizzato.

Mettendo autor_name vedremo i nomi degli autori corrispondenti a DataValuefield.

Facciamo il Bind l'origine dei dati al nostro controllo server e aggiungiamo come primo valore un asterisco in modo che l'utente sia costretto a scegliere un valore e non si sbagli inviando magari il pirmo record della tabella.

Infine richiamiamo questo metodo dentro al Page_Load in modo che venga caricato in apertura di pagina:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlAuthorSource();
}
}

 

A questo punto se avete letto l'altro articolo con attenzione vi sareste dovuti rendere conto di una cosa: non ho dovuto creare una classe apposita che rappresenta gli Autori perchè qua non mi serve.

Di la l'avevo fatto perchè se poi volevo inserire un libro nuovo avevo bisogno di recuperare l'id da passare alla query di inserimento.

Qui l'id già ce l'ho, e lo ottengo tramite DataValuefield.

In fase di inserimento, quindi, a un possibile metodo passerete il valore tramite:

ddlAuthot.SelectedValue;

Ci penserà DataValuefield a passargli l'id.


Condividi

1 Commenti

  • Barbara Barbara

    come posso fare per popolare delle dropdown da liste già esitenti? e lato spx ? da popolare sono -Attività -Esito -Causale ti posto codice ascx.cs: using Microsoft.SharePoint; using System; using System.ComponentModel; using System.Web.UI.WebControls.WebParts; using System.Linq; using Microsoft.SharePoint.Utilities; namespace Lavorazioni.Crm.WP.GestioneAttivita { [ToolboxItemAttribute(false)] public partial class GestioneAttivita : WebPart { // Uncomment the following SecurityPermission attribute only when doing Performance Profiling on a farm solution // using the Instrumentation method, and then remove the SecurityPermission attribute when the code is ready // for production. Because the SecurityPermission attribute bypasses the security check for callers of // your constructor, it's not recommended for production purposes. // [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Assert, UnmanagedCode = true)] public GestioneAttivita() { } protected override void OnInit(EventArgs e) { base.OnInit(e); InitializeControl(); } protected void Page_Load(object sender, EventArgs e) { // _id = Page.Request.QueryString["ID"]; if (!Page.IsPostBack) { SPSecurity.RunWithElevatedPrivileges(delegate () { using (SPSite ElevatedSite = new SPSite(SPContext.Current.Web.Site.ID)) using (SPWeb ElevatedWeb = ElevatedSite.OpenWeb(SPContext.Current.Web.ID)) { //CaricaTendina(ElevatedWeb); // CaricaGriglia(ElevatedWeb); CaricaItem(ElevatedWeb); } }); } } protected void btnSeleziona_Click(object sender, EventArgs e) { SPSecurity.RunWithElevatedPrivileges(delegate () { using (SPSite ElevatedSite = new SPSite(SPContext.Current.Web.Site.ID)) using (SPWeb ElevatedWeb = ElevatedSite.OpenWeb(SPContext.Current.Web.ID)) { CaricaItem(ElevatedWeb); } }); } protected void btnAnnulla_Click(object sender, EventArgs e) { SPSecurity.RunWithElevatedPrivileges(delegate () { using (SPSite ElevatedSite = new SPSite(SPContext.Current.Web.Site.ID)) using (SPWeb ElevatedWeb = ElevatedSite.OpenWeb(SPContext.Current.Web.ID)) { PulisciControlli(); CaricaItem(ElevatedWeb); } }); } private void PulisciControlli() { txtAttivita.Text = ""; txtEsito.Text = ""; txtCausale.Text = ""; txtOrigineCSV.Text = ""; } private void CaricaItem(SPWeb web) { SPList listaGestAtt = web.GetList(web.ServerRelativeUrl + "/Lists/" + ddlListaDiRiferimento.Text); SPListItemCollection items = listaGestAtt.GetItems(); var itemBindabili = from SPListItem i in items.Cast<SPListItem>() select new { ID = i.ID, Titolo = i["Title"], Attivita = new SPFieldLookupValue(i["Attivit_x00e0_"] as String).LookupValue, OrigineCSV = new SPFieldLookupValue(i["OrigineCSV"] as String).LookupValue, IDUtente = ControllaID(web, Convert.ToString(i["Utente"])), Utente = ControllaUtente(web, Convert.ToString(i["Utente"])), Esito = new SPFieldLookupValue(i["Esito"] as String).LookupValue, Causale = new SPFieldLookupValue(i["Causale"] as String).LookupValue }; grdItems.DataSource = itemBindabili.ToList(); grdItems.DataBind(); } private string ControllaUtente(SPWeb web, string fieldValue) { if (!string.IsNullOrEmpty(fieldValue)) return new SPFieldUserValue(web, fieldValue).User.Name; else return (fieldValue); } private int ControllaID(SPWeb web, string fieldValue) { if (!string.IsNullOrEmpty(fieldValue)) return new SPFieldUserValue(web, fieldValue).User.ID; else return -1; } protected void ddlListaDiRiferimento_SelectedIndexChanged(object sender, EventArgs e) { string value = ddlListaDiRiferimento.SelectedValue; } } }

    24/03/2020

Commentami!