19. marts 2008 - 15:31Der er
9 kommentarer og 1 løsning
Bruge page-elements i en klasse
Jeg vil gerne lave en funktion, der kan kaldes fra flere sider. Jeg har derfor lavet en myClass.vb fil, og jeg kan også godt kalde de subs/funktioner der ligger i den.
Men i en af funktionerne, har jeg brug for, at den henter data fra et GridView på siden. Problemet er, at jeg åbenbart ikke kan referere til elementerne på siden, inde i en class.vb fil.
Jeg er godt klar over, at da den jo kan kaldes fra flere sider, er det ikke sikkert, at de samme elementer er på siderne. Men det tager jeg selvfølgelig højde for, derfra hvor jeg kalder funktionen.
Kan det ikke lade sig gøre, at bruge disse elementer, eller er der en anden løsning på problemet?
Jeg har ikke lavet den endnu, da jeg ret hurtigt stødte på problemet. Men jeg forsøger at kalde et gridview, der hedder "gridview1".
Jeg udvikler i Visual Web Developer, og allerede der kan jeg se, at den ikke kan genkender gridview1. Det giver også fejl, når jeg førsøger at køre siden.
Jeg har f.eks. en .aspx side med et gridview og en knap. Ved klik på knappen skal myClass kaldes.
Jeg er blevet nødt til at lade knappen kalde en sub i min codebehind side, og så lade den sub kalde myClass. Subs i myClass kan ikke kaldes direkte fra .aspx siden (så fejler den ved at den ikke kan finde sub'en).
Du må af en eller anden grund ikke kalde din klasse myClass og bruge den som identifier, så jeg har kaldt den testClass i stedet og smidt den i mappen AppCode. Hvis du bruger SQLServer så skal du skifte til System.Data.Sql i stedet for OleDB, som her i eksemplet hvor det er en Access.
TestClass.vb (husk at rette ConnectionString til den du har konf. i web.config)
Public Class testClass Function GetData(ByVal queryString As String) As DataSet Dim connectionString As String = ConfigurationManager.ConnectionStrings("DinConnectionString").ConnectionString Dim ds As New DataSet() Try Dim connection As New OleDbConnection(connectionString) Dim adapter As New OleDbDataAdapter(queryString, connection) adapter.Fill(ds) Catch ex As Exception HttpContext.Current.Response.Write(ex.ToString()) ' Lav noget fejl-lir her End Try Return ds End Function End Class
Så en aspx-side der hedder test.aspx:
Her placerer du et GridView og kalder det GridView1
I denne sides codebehind, test.aspx.vb kalder du funktionen der er defineret i testClass, og binder til dit GridView1 som nævnt:
Imports System.Data
Partial Class test Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then 'Instantier din testClass her Dim t As New testClass
Dim queryString As String = _ "SELECT * FROM DinTabel"
'Smid din sql-streng ind i din function i testClass 'og Bind til det gridview du har på siden. Dim ds As DataSet = t.GetData(queryString) If (ds.Tables.Count > 0) Then GridView1.DataSource = ds GridView1.DataBind() Else Response.Write("Kan ikke connecte til db") End If End If End Sub End Class
Public Class testClass Public Function GetData(ByVal queryString As String, ByVal g As GridView) As DataSet Dim connectionString As String = ConfigurationManager.ConnectionStrings("DinConnectionString").ConnectionString Dim ds As New DataSet() Try Dim connection As New OleDbConnection(connectionString) Dim adapter As New OleDbDataAdapter(queryString, connection) adapter.Fill(ds)
g.DataSource = ds g.DataBind()
Catch ex As Exception HttpContext.Current.Response.Write(ex.ToString()) ' Lav noget fejl-lir her End Try Return ds End Function End Class
Og din codebehind test.aspx.vb:
Imports System.Data Imports testClass
Partial Class test Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then Dim t As New testClass Dim queryString As String = _ "SELECT * FROM DinTabel" Dim ds As DataSet = t.GetData(queryString, GridView1) End If End Sub End Class
Herved skal du jo skrive mindre kode når du skal kalde funktionen, men så kan du kun bruge klassen til at binde GridViews, hvilket gør den mindre fleksibel... Jeg hælder mest til første løsning.
Men ja, så skal du smide GridView1 med ind som parameter, men så er funktionen også låst til kun at kunne behandle GridViews. - Det kunne jo være du skulle bruge nogle af de andre datakontroller. Men så kan du selvfølgelig bare have begge funktioner i din klasse. Up 2 u =)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.