Newsgroup: it.comp.www.asp
Titolo: Veramente difficile - DropDownList in Datagrid

Scusate ma sto facendo un'operazione complessa, infatti eseguo in un
DataGrid un edit di una riga che contiene non solo semplici textbox ma anche
una DropDownList la cui lista proviene dalla tabella di un database... non
solo, selezionando un valore nel DropDownList vorrei ottenere la
compilazione dei dati nei textbox recuperando i dati dalla riga del record
della stessa tabella che popola il DataGrid.
La cosa complessa è proprio quella di eseguire queste due operazioni:
1) popolare con una lista proveniente dalla tabella di un Database un
DropDownList.
2) nel momento in cui seleziono un valore del DropDownList ottengo la
compilazione di uno specifico TextBox.
Per capire meglio cosa stò facendo allego i listati:
INTERFACCIA GRAFICA:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="insert.aspx.vb"
Inherits="Prova.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <title>WebForm1</title>
  <meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">
  <meta content="Visual Basic 7.0" name="CODE_LANGUAGE">
  <meta content="JavaScript" name="vs_defaultClientScript">
  <meta content="
http://schemas.microsoft.com/intellisense/ie5
"
name="vs_targetSchema">
 </HEAD>
 <body>
  <form id="Form1" method="post" runat="server">
   <P><asp:datagrid id="myDataGrid" runat="server" Font-Names="Verdana"
Font-Size="8pt" AutoGenerateColumns="False" DataKeyField="ProductID"
OnSelectedIndexChanged="insertNewRow" OnDeleteCommand="DeleteRow"
OnEditCommand="editProduct" OnCancelCommand="CancelEdit"
OnUpdateCommand="updateProduct" BorderColor="#CC9966" BorderStyle="None"
BorderWidth="1px" BackColor="White" CellPadding="4">
     <SelectedItemStyle Font-Bold="True" ForeColor="#663399"
BackColor="White"></SelectedItemStyle>
     <ItemStyle ForeColor="#330099" BackColor="White"></ItemStyle>
     <HeaderStyle Font-Bold="True" ForeColor="#FFFFCC"
BackColor="#990000"></HeaderStyle>
     <FooterStyle ForeColor="#330099" BackColor="#FFFFCC"></FooterStyle>
     <Columns>
      <asp:EditCommandColumn ButtonType="PushButton" UpdateText="Aggiorna"
CancelText="Cancella" EditText="Modifica"></asp:EditCommandColumn>
      <asp:BoundColumn DataField="ProductID" ReadOnly="True"
HeaderText="Codice Prodotto"></asp:BoundColumn>
      <asp:TemplateColumn HeaderText="Nome Prodotto">
       <ItemTemplate>
        <asp:Label runat="server" Text='<%# DataBinder.Eval(Container,
"DataItem.productName") %>'>
        </asp:Label>
       </ItemTemplate>
       <EditItemTemplate>
        <asp:DropDownList runat="server" id="lista_productName">
        </asp:DropDownList>
       </EditItemTemplate>
      </asp:TemplateColumn>
      <asp:BoundColumn DataField="UnitPrice"
HeaderText="Prezzo"></asp:BoundColumn>
      <asp:ButtonColumn Text="X" ButtonType="PushButton"
CommandName="Delete"></asp:ButtonColumn>
      <asp:ButtonColumn Text="+" ButtonType="PushButton"
CommandName="Select"></asp:ButtonColumn>
     </Columns>
     <PagerStyle HorizontalAlign="Center" ForeColor="#330099"
BackColor="#FFFFCC"></PagerStyle>
    </asp:datagrid></P>
  </form>
 </body>
</HTML>
-------------------------------------------------------------------
MODULO:
Public Class WebForm1
Inherits 
System.Web.UI.Page
Protected WithEvents myDataGrid As System.Web.UI.WebControls.DataGrid
Dim strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Inetpub\wwwroot\Prova\ProvaDb.mdb"
#Region " Codice generato da Progettazione Web Form "
'Chiamata richiesta da Progettazione Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Init
'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
'Non modificarla nell'editor del codice.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
BindData()
End If
End Sub
Sub BindData()
Dim myConnection As OleDb.OleDbConnection
Dim myCommand As OleDb.OleDbCommand
myConnection = New OleDb.OleDbConnection(strConnection)
myCommand = New OleDb.OleDbCommand("SELECT * FROM Products", myConnection)
myConnection.Open()
myDataGrid.DataSource = myCommand.ExecuteReader
myDataGrid.DataBind()
myConnection.Close()
End Sub
Sub EditProduct(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
myDataGrid.EditItemIndex = e.Item.ItemIndex
BindData()
End Sub
Sub CancelEdit(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
myDataGrid.EditItemIndex = -1
BindData()
End Sub
Sub updateProduct(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
'Aggiorna il database
Dim myConnection As OleDb.OleDbConnection
Dim myCommand As OleDb.OleDbCommand
Dim sqlString As String
'Ottiene nuovi valori
Dim productName As DropDownList
productName = e.Item.FindControl("edit_productName")
Dim unitPrice As TextBox
unitPrice = e.Item.Cells(3).Controls(0)
myConnection = New OleDb.OleDbConnection(strConnection)
sqlString = "UPDATE Products SET ProductName = @productName, UnitPrice =
@unitPrice WHERE ProductID=@productID"
myCommand = New OleDb.OleDbCommand(sqlString, myConnection)
myCommand.Parameters.Add(New OleDb.OleDbParameter("@ProductName",
OleDb.OleDbType.VarChar, 80))
myCommand.Parameters("@ProductName").Value = productName.SelectedItem.Text
myCommand.Parameters.Add(New OleDb.OleDbParameter("@unitPrice",
OleDb.OleDbType.VarChar, 80))
myCommand.Parameters("@unitPrice").Value = unitPrice.Text
myCommand.Parameters.Add(New OleDb.OleDbParameter("@productID",
OleDb.OleDbType.Integer))
myCommand.Parameters("@productID").Value =
myDataGrid.DataKeys.Item(e.Item.ItemIndex)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
myDataGrid.EditItemIndex = -1
BindData()
End Sub
Sub GeneraListaUnitaDiMisura(ByVal s As Object, ByVal e As System.EventArgs)
If Page.IsPostBack Then
'recupero i dati dal database per popolare il DropList
'Dichiara ed apre la connessione con il database Access
Dim myConnection As OleDb.OleDbConnection
Dim mydataAdapter As OleDb.OleDbDataAdapter
Dim myDataSet As Data.DataSet
Dim myDataTable As Data.DataTable
Dim myRow As Data.DataRow
Dim myList As New ArrayList()
Dim lista_productName As DropDownList
myConnection = New OleDb.OleDbConnection(strConnection)
mydataAdapter = New OleDb.OleDbDataAdapter("select * from tbl_ListaProdotti
ORDER BY prodotto", myConnection)
myDataSet = New DataSet()
mydataAdapter.Fill(myDataSet, "prodotto")
For Each myRow In myDataSet.Tables("prodotto").Rows
myList.Add(myRow("prodotto"))
Next
lista_productName.DataSource = myList
lista_productName.DataBind()
End If
End Sub
Sub DeleteRow(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
'Cancella la riga specifica nel database
Dim myConnection As OleDb.OleDbConnection
Dim myCommand As OleDb.OleDbCommand
Dim sqlString As String
myConnection = New OleDb.OleDbConnection(strConnection)
sqlString = "DELETE * FROM Products WHERE ProductID=@productID"
myCommand = New OleDb.OleDbCommand(sqlString, myConnection)
myCommand.Parameters.Add(New OleDb.OleDbParameter("@productID",
OleDb.OleDbType.Integer))
myCommand.Parameters("@productID").Value =
myDataGrid.DataKeys.Item(e.Item.ItemIndex)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
myDataGrid.EditItemIndex = -1
BindData()
End Sub
Sub insertNewRow(ByVal a As Object, ByVal e As EventArgs)
'Inserisce una nuova riga nel database
Dim myConnection As OleDb.OleDbConnection
Dim myCommand As OleDb.OleDbCommand
Dim sqlString As String
myConnection = New OleDb.OleDbConnection(strConnection)
sqlString = "INSERT INTO Products (ProductID) VALUES (@productID)"
myCommand = New OleDb.OleDbCommand(sqlString, myConnection)
myCommand.Parameters.Add(New OleDb.OleDbParameter("@productID",
OleDb.OleDbType.Integer))
myCommand.Parameters("@productID").Value = "100"
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
BindData()
End Sub
End Class
-----------------------------------------------------------
database Access con due tabelle: Products e tbl_ListaProdotti
Tabella Products ha i seguenti campi: productID(numerico, intero),
ProductName (testo), unitPrice(testo)
Tabella tbl_ListaProdotti ha i seguenti campi: Prodotti (testo), Prezzo
(testo)
Grazie a tutti che collaborano per la buona riuscita di un progetto
complesso come questo.
Ciao.
Roberta Binetti

 compilazione di uno specifico TextBox.
Dunque... La parte più complessa di quello che vuoi ottenere è in questa
operazione:
- Nella dropdownlist, in modalità Edit del Datagrid, vuoi che compaia la
lista di prodotti, e tale lista dev'essere popolata dalla tabella
"tbl_ListaProdotti".
Una volta che l'utente ha selezionato un prodotto, in una textbox a fianco
vuoi che appaia automaticamente il prezzo, sempre preso da quella tabella.
Ok, per il primo passo ti consiglio la lettura di questo tutorial:
http://aspnet.4guysfromrolla.com/articles/080702-1.aspx
che ti spiega come *popolare* un dropdownlist da una query e la selezione
del valore sempre preso da quella query.
Per il secondo punto, devi modificare il dropdownlist aggiungendo l'evento
AutoPostBack e la routine da attivare al momento della selezione da parte
dell'utente di un valore:
<asp:dropDownlist id="lista_productName" runat="server"
....
AutoPostBack="true"
OnSelectedIndexChanged="Cambia" />
Quindi, la routine Cambia:
sub Cambia(o as Object, e as EventArgs)
dim scelta as string
scelta=ctype(o,DropDownList).SelectedItem.Text
' In scelta hai il testo che l'utente ha selezionato
' se volevi prendere il valore:
' scelta=ctype(o,DropDownList).SelectedItem.Value
'
' Quindi apri la tabella tbl_ListaProdotti ricercando il
' prodotto scelto dall'utente, quindi  inserisci i valori di
' quel prodotto.
prezzo as string
prezzo=re["prezzo"].ToString()
' E adesso puoi inserire il valore preso dal database
' nel textbox:
dim tt as TextBox
tt=ctype(DataGrid1.Items[DataGrid1.EditItemIndex].FindControl("textbox_prezzo"),TextBox)
tt.TextBox=prezzo
end sub
Semplice, no? ;)
Ciao
--
AZ