scusatemi, approfitto per rendere pubblica la soluzione ad un piccolo problema comune, ossia come usare una dropdownlist in un EditItemTemplate con Asp.Net 1.1. L'esempio e' pensato per due tabelle, tbUtenti e tbGruppi (un tipico raggruppamento tipologico di utenti). La prima, tra gli altri campi, ha un riferimento <idgruppo> e la seconda ha due campi, <id> e <descrizione> :
codice:
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Sqlclient" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
Dim ConnStr As String = ConfigurationSettings.AppSettings("strconn_db")
Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)
If Not IsPostBack Then
BindGrid()
End If
End Sub
Sub BindGrid()
Dim SQL As String = "SELECT * FROM TBUTENTI"
Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
Dim DS As New DataSet
DA.Fill(DS, "utenti")
DataGrid1.DataSource = DS.Tables("utenti").DefaultView
DataGrid1.DataBind()
End Sub
Private Sub DataGrid1_EditCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
DataGrid1.EditItemIndex = e.Item.ItemIndex
BindGrid()
End Sub
Private Sub DataGrid1_CancelCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
DataGrid1.EditItemIndex = -1
BindGrid()
End Sub
Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs)
If e.Item.ItemType = ListItemType.EditItem Then
Dim DRV As DataRowView = CType(e.Item.DataItem, DataRowView)
Dim CurrentGruppo As String = Vgruppo(DRV("idgruppo"))
Dim DDL As DropDownList = CType(e.Item.Cells(6).Controls(1), DropDownList)
' Faccio un dataset con id e desc dei gruppi
Dim SQL As String = "SELECT id, descrizione FROM tbGruppi ORDER BY ID"
Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
Dim DS As New DataSet
Dim item As New ListItem
DA.Fill(DS, "gruppi")
' Popolo la drop
DDL.DataSource = DS.Tables("gruppi").DefaultView
DDL.DataTextField = "descrizione"
DDL.DataValueField = "id"
DDL.DataBind()
' Mi posiziono sull'item del record...
item = DDL.Items.FindByText(CurrentGruppo)
If Not item Is Nothing Then item.Selected = True
End If
End Sub
' ESEGUO L'AGGIORNAMENTO SUL DB
Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
Dim DDL As DropDownList = CType(e.Item.Cells(6).Controls(1), DropDownList)
Dim idgruppo As Integer = DDL.SelectedValue
Dim idutente As Integer = DataGrid1.DataKeys(e.Item.ItemIndex)
Dim SQL As String = "UPDATE TBUTENTI SET IDGRUPPO=@IdGruppo WHERE ID=@Id"
Dim Conn As SqlConnection = New SqlConnection(ConnStr)
Dim Cmd As New SqlCommand(SQL, Conn)
Cmd.Parameters.Add(New SqlParameter("@IdGruppo", idgruppo))
Cmd.Parameters.Add(New SqlParameter("@Id", idutente))
Conn.Open()
Cmd.ExecuteNonQuery()
Conn.Close()
DataGrid1.EditItemIndex = -1
BindGrid()
End Sub
Function Vgruppo(ByVal id As Integer) As String
Dim SQL As String = "SELECT ID,DESCRIZIONE FROM TBGRUPPI WHERE ID=" & Convert.ToInt32(id)
Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
Dim ds As New DataSet
DA.Fill(ds, "id")
Dim result As String
result = Convert.ToString(ds.Tables(0).Rows(0).Item(1))
Return result
End Function
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Locali</title>
<link href="../stile.css" type="text/css" rel="stylesheet">
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DataGrid Width="100%" ID="DataGrid1" runat="server" DataKeyField="ID"
AutoGenerateColumns="False"
CellPadding="5" ShowHeader="true" ShowFooter="true" HeaderStyle-Font-Size="Small"
FooterStyle-Font-Size="small" HeaderStyle-Height="8px" FooterStyle-Height="8px"
BorderColor="#000000"
BorderStyle="Double" OnUpdateCommand="DataGrid1_UpdateCommand" OnItemDataBound="DataGrid1_ItemDataBound"
OnEditCommand="DataGrid1_EditCommand" OnCancelCommand="DataGrid1_CancelCommand">
<Columns>
<asp:EditCommandColumn ItemStyle-HorizontalAlign="Center" HeaderText="Opzioni" HeaderStyle-Font-Bold="true"
HeaderStyle-HorizontalAlign="Center" EditText="Edita" CancelText="Cancella" UpdateText="Aggiorna" />
<asp:BoundColumn DataField="Campo1" HeaderText="Campo1" HeaderStyle-Font-Bold="true"
ReadOnly="True" />
<asp:BoundColumn DataField="Campo2" HeaderText="Campo2" HeaderStyle-Font-Bold="true"
ReadOnly="True" />
<asp:BoundColumn DataField="Campo3" HeaderText="Campo3" HeaderStyle-Font-Bold="true"
ReadOnly="True" />
<asp:BoundColumn DataField="Campo4" HeaderText="Campo4" HeaderStyle-Font-Bold="true"
ReadOnly="True" />
<asp:BoundColumn DataField="Campo5" HeaderText="Campo5" HeaderStyle-Font-Bold="true"
ReadOnly="True" />
<asp:TemplateColumn HeaderText="Gruppo">
<ItemTemplate>
<%#Vgruppo(Container.DataItem("idgruppo"))%>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList runat="server" ID="ddgruppi" />
</EditItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</div>
</form>
</body>
</html>
Naturalmente le istruzioni
codice:
CType(e.Item.Cells(6).Controls(1), DropDownList)
cambiano in CType(e.Item.Cells(X).Controls(1), DropDownList
secondo il num. di campi della tabella..
spero di essere stato utile a qualcuno.