adszone.org
venerdì 20 settembre 2024
"Il modo corretto di pensare il software"
home
consulenza  vb.net  contatti 
  Visual Basic .NET
  Asp.Net ed Ado.Net
Domande

ASP.NET ed ADO.NET

In questo articolo mostriamo come aggiungere le funzionalita' di ADO.NET in una pagina ASP.NET. Non entreremo di nuovo nei dettagli della programmazione di ADO.NET, di cui abbiamo gia' parlato nella sezione che gli compete. L'esempio che illustriamo e' stato gia' trattato nella sezione Controlli, articolo Databinding. Vi consiglio di rileggerlo.

Lo scopo della pagina e' quello di visualizzare, in una lista lstLettere, l'elenco delle email, memorizzate nel database "Posta.mdb". Tre caselle di testo visualizzeranno il resto delle informazione relative alla email selezionata nella lista.

Tabella "Posta"
indice mittente oggetto data testo
1 dante@alighieri.it Commedia 01 / 01 / 2001 Nel mezzo del cammin....
2 babbo@natale.com Auguri 01 / 01 / 2001 Buon natale
3 guido@lamacchina.org Viabilita' 01 / 01 / 2001 Via libera

Inseriamo nel Form aspx i quattro controlli che visualizzeranno i dati: lstLettere, txtOggetto, txtData, txtMessaggio:

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
       Inherits="VBN_Tut_AspxAdo.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
        <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/
             intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
         <form id="Form1" method="post" runat="server">
         
            <asp:ListBox id="lstLettere" style="Z-INDEX: 101; LEFT: 16px; 
                POSITION: absolute; TOP: 32px" runat="server" Width="152px">
                </asp:ListBox>
                
            <asp:TextBox id="txtMessaggio" style="Z-INDEX: 104; LEFT: 176px; 
                POSITION: absolute; TOP: 64px" runat="server" Width="312px" 
                Height="104px"></asp:TextBox>
                
            <asp:TextBox id="txtData" style="Z-INDEX: 103; LEFT: 336px; 
                POSITION: absolute; TOP: 32px" runat="server"></asp:TextBox>
                
            <asp:TextBox id="txtOggetto" style="Z-INDEX: 102; LEFT: 176px; 
                POSITION: absolute; TOP: 32px" runat="server"></asp:TextBox>
                
         </form>
    </body>
</HTML>

Il Databinding realizzato per un form aspx, non e' molto flessibile, ci sono molti passi che non sono automatizzati e che richiedono comunque scrittura di codice. E' possibile automatizzare la visualizzazione dei dati in un controllo, ma e' piu' complicato aggiornare il dato in conseguenza di un PostBack.

Abbiamo deciso di utilizzare un DataSet e caricarlo con i dati relativi alla tabella di interesse, usare il Databinding per collegare la lista alla colonna dei mittenti e impostare via codice i valori delle TextBox.

Il Databinding complesso, come quello della ListBox che utilizziamo, e' piuttosto semplice da realizzare. Associamo il DataSet, popolato dalla procedura LoadData, alla lista, tramite la proprieta' DataSource e poi indichiamo la colonna da visualizzare con la proprieta' DataTextField. Il binding viene poi effettuato chiamando il metodo DataBind sulla pagina (Me). Notate la proprieta' AutoPostBack. I controlli che ne dispongono possono effettuare il submit del Form, proprio come farebbe un pulsante. Nel caso di una ListBox, il PostBack viene eseguito al cambio della selezione degli elementi della lista.

In questo modo, ogni volta che selezioniamo un nuovo elemento, il form viene ricaricato generando prima l'evento Load del Form e poi il SelectedIndexChanged della Lista.

Nell'evento SelectedIndexChanged, dalla lista reperiamo l'indice che corrispondera' anche alla posizione della riga della tabella da dove prendere il resto delle informazioni. Ottenuta la riga, objRow, assegnamo i valori dei campi alle TextBox relative, ed il gioco e' fatto.

Imports System.Data
Imports System.Data.OleDb

Public Class WebForm1
    Inherits System.Web.UI.Page

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <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: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    
    Protected WithEvents lstLettere As System.Web.UI.WebControls.ListBox
    Protected WithEvents txtMessaggio As System.Web.UI.WebControls.TextBox
    Protected WithEvents txtData As System.Web.UI.WebControls.TextBox
    Protected WithEvents txtOggetto As System.Web.UI.WebControls.TextBox
    
    Dim DataSet_Posta As DataSet
    
    Private Sub LoadData() 
        Dim objConn As OleDbConnection
        Dim objAdapter As OleDbDataAdapter
        
        
        objConn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" _
                & "Data Source=C:\Inetpub\wwwroot\VBN_Tut_AspxAdo\posta.mdb;")
        
        objAdapter = New OleDbDataAdapter("select * from posta", objConn)
        DataSet_Posta = New DataSet()
        
        objAdapter.Fill(DataSet_Posta, "posta")
        
        objAdapter.Dispose()
        objConn.Close()
    End Sub

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As _
            System.EventArgs) Handles MyBase.Load

        LoadData() 

        If Not Me.IsPostBack Then
            lstLettere.AutoPostBack = True
            lstLettere.DataSource = DataSet_Posta.Tables("posta")
            lstLettere.DataTextField = "mittente" 
        End If
        
        Me.DataBind() 
    End Sub
	
    Private Sub lstLettere_SelectedIndexChanged(ByVal sender As Object, _
             ByVal e As System.EventArgs) _
             Handles lstLettere.SelectedIndexChanged
             
        Dim idx As Integer = lstLettere.SelectedIndex
        If idx = -1 Then Return

        Dim objRow As DataRow        
        objRow = DataSet_Posta.Tables("posta").Rows(idx) 
        
        txtOggetto.Text = objRow.Item(2)
        txtData.Text = objRow.Item(3)
        txtMessaggio.Text = objRow.Item(4) 
    End Sub
End Class
Ultimo aggiornamento 18/02/2004