Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_creare-una-colonna-di-tipo-dropdownlist-_872.aspx
Introduzione
Nell’articolo viene descritta la tecnica di come inserire in un controllo gridview una colonna di tipo DropDownList, e tramite un controllo di tipo button, rilevare i valori di ogni riga della griglia.
Inserire nella pagina web, un controllo griglia ed un controllo button, il tutto come mostrato in figura 1.
Figura 1
Stesura di codice
Aggiungiamo al controllo griglia, tre colonne due di tipo BoundField, mentre una di tipo templateField.
Nella colonna templateField, inseriamo un controllo di tipo dropDownlist, qui di seguito si riporta il codice Html delle colonne.
<Columns>
<asp:BoundField DataField="Nome" HeaderText="Nome" />
<asp:BoundField DataField="Cognome" HeaderText="Cognome" />
<asp:TemplateField HeaderText="Città">
<ItemTemplate>
<asp:DropDownList ID="DdlCitta" runat="server"></asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
Come si vede dal codice, le prime due colonne, visualizzeranno i valori dei campi (nome e cognome) che verranno caricati nella griglia, mentre nella clona templateField, visualizzerà una dropDonlist.
Terminato ciò, occorre caricare dei dati, qui di seguito si riporta una funzione che carica un oggetto di tipo datatable, in cui si trovano alcuni dati.
VB.Net
Private Sub CaricaDati()
Dim Nome As New DataColumn("Nome")
Dim Cognome As New DataColumn("Cognome")
Dim Citta As New DataColumn("Citta")
Dim riga As DataRow
Dim dttTabella As New DataTable()
dttTabella.Columns.Add(Nome)
dttTabella.Columns.Add(Cognome)
dttTabella.Columns.Add(Citta)
riga = dttTabella.NewRow()
riga(0) = "EMa"
riga(1) = "Maffei"
riga(2) = "Roma"
dttTabella.Rows.Add(riga)
riga = dttTabella.NewRow()
riga(0) = "EMa2"
riga(1) = "maffei3"
riga(2) = "Milano"
dttTabella.Rows.Add(riga)
riga = dttTabella.NewRow()
riga(0) = "EMa3"
riga(1) = "maffei2"
riga(2) = "Palermo"
dttTabella.Rows.Add(riga)
GridView1.DataSource = dttTabella
GridView1.DataBind()
End Sub
C#
private void CaricaDati()
{
DataColumn Nome = new DataColumn("Nome");
DataColumn Cognome = new DataColumn("Cognome");
DataColumn Citta = new DataColumn("Citta");
DataRow riga;
DataTable dttTabella = new DataTable();
dttTabella.Columns.Add(Nome);
dttTabella.Columns.Add(Cognome);
dttTabella.Columns.Add(Citta);
riga = dttTabella.NewRow();
riga[0] = "EMa";
riga[1] = "Maffei";
riga[2] = "Roma";
dttTabella.Rows.Add(riga);
riga = dttTabella.NewRow();
riga[0] = "EMa2";
riga[1] = "maffei3";
riga[2] = "Milano";
dttTabella.Rows.Add(riga);
riga = dttTabella.NewRow();
riga[0] = "EMa3";
riga[1] = "maffei2";
riga[2] = "Palermo";
dttTabella.Rows.Add(riga);
GridView1.DataSource = dttTabella;
GridView1.DataBind();
}
La funzione viene richiamata nell’evento load della pagina
Ora si deve creare una funzione, che restituisce un oggetto di tipo datable, che viene utilizzata per il caricamento delle varie DropDownList situate all’interno del controllo griglia.
VB.Net
Private Function CaricaCitta() As DataTable
'Dim Nome As New DataColumn("Citta")
'Dim Cognome As New DataColumn("Cognome")
Dim Citta As New DataColumn("Citta")
Dim riga As DataRow
Dim dttTabella As New DataTable()
'dttTabella.Columns.Add(Nome)
'dttTabella.Columns.Add(Cognome)
dttTabella.Columns.Add(Citta)
riga = dttTabella.NewRow()
'riga(0) = "EMa"
'riga(1) = "Maffei"
riga(0) = "Roma"
dttTabella.Rows.Add(riga)
riga = dttTabella.NewRow()
'riga(0) = "EMa2"
'riga(1) = "maffei3"
riga(0) = "Milano"
dttTabella.Rows.Add(riga)
riga = dttTabella.NewRow()
'riga(0) = "EMa3"
'riga(1) = "maffei2"
riga(0) = "Palermo"
dttTabella.Rows.Add(riga)
Return dttTabella
End Function
C#
private DataTable CaricaCitta()
{
DataColumn Citta = new DataColumn("Citta");
DataRow riga;
DataTable dttTabella = new DataTable();
dttTabella.Columns.Add(Citta);
riga = dttTabella.NewRow();
riga[0] = "Roma";
dttTabella.Rows.Add(riga);
riga = dttTabella.NewRow();
riga[0] = "Milano";
dttTabella.Rows.Add(riga);
riga = dttTabella.NewRow();
riga[0] = "Palermo";
dttTabella.Rows.Add(riga);
return dttTabella;
}
Nell’evento RowDataBound, dobbiamo caricare le dropDowlist e poi impostargli il valore di appartenenza al record di cui fa parte.
Con l’oggetto di tipo DataRowView, rilevo il valore della colonna Citta, della sorgente dati di cui è stato caricato il gridView, in questo modo, ho il valore della riga di una determinata colonna, questo valore si utilizza per impostare il valore della dropDowList.
VB.Net
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim dtvCitta As DataRowView = CType(e.Row.DataItem, DataRowView)
Dim citta As String = dtvCitta("Citta").ToString()
Dim dttCitta As DataTable = CaricaCitta()
Dim ddlcitta As DropDownList = DirectCast(e.Row.FindControl("DdlCitta"), DropDownList)
ddlcitta.DataSource = dttCitta
'ddlcitta.DataMember = "Citta"
ddlcitta.DataValueField = "Citta"
ddlcitta.DataBind()
ddlcitta.SelectedValue = citta
End If
C#
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView dtvCitta = (DataRowView)e.Row.DataItem;
string citta = dtvCitta["Citta"].ToString();
DataTable dttCitta = CaricaCitta();
DropDownList ddlcitta = (DropDownList)e.Row.FindControl("DdlCitta");
ddlcitta.DataSource = dttCitta;
ddlcitta.DataValueField = "Citta";
ddlcitta.DataBind();
ddlcitta.SelectedValue = citta;
}
}
Ora non resta che rilevare il valore della combo box, nell’evento click del pulsante, si fa un ciclo per ogni riga, e si visualizza a video il valore.
Qui di seguito si riporta il codice delle suddette operazioni.
VB.Net
For contaRighe As Integer = 0 To GridView1.Rows.Count - 1
Dim Citta As String
Citta = DirectCast(GridView1.Rows(contaRighe).FindControl("DdlCitta"), DropDownList).SelectedItem.Text
Response.Write(Citta + " ")
Next
C#
for (int contaRighe = 0; contaRighe < GridView1.Rows.Count; contaRighe++)
{
string Citta = "";
Citta = ((DropDownList)GridView1.Rows[contaRighe].FindControl("DdlCitta")).SelectedItem.Text ;
Response.Write(Citta + " ");
}
Conclusioni
Abbiamo visto come impostare in un controllo gridview una colonna di tipo dropDownlist, tramite la parola download potete scaricare il sorgente utilizzato in questo articolo sia per il linguaggio vb.Net che per C#.
Download