Jag har skapat en klass "ForumClass" i katalogen "App_Code". Var får du felmeddelande? ja den är: Hej Sead Jag vill först tacka er men framförallt dig Thomas för att du tog dig tid å svarade så detaljerat på min fråga. Hej igen Tack Thomas!anropa en klass i codebehind
Klassen har bl a en funkton med namn "addForum".
Hur gör jag för att sen anropa addForum i codebehind på en av mina aspx??
Jag försöker med följande men får fel-meddelande "declaratin expekted"...
Imports ForumClass
Partial Class Forum_AddForum
Inherits System.Web.UI.Page
Protected Sub addForum(ByVal sender As Object, ByVal e As System.EventArgs) Handles knappLaggTillNyttForum.Click
Dim minKlass As New ForumClass
minKlass.addForum()
End Sub
End ClassSv: anropa en klass i codebehind
Har du deklarerat metoden som publik?Sv:anropa en klass i codebehind
Public Sub addForum(.....)
men när jag skriver
Dim minKlass As New ForumClass
minKlass.addForum()
så blir minklass understruken = "declaratin expekted"
Nån som har nån bra länk om hur man jobbar med klasser i MS Visual Studio???Sv: anropa en klass i codebehind
Jag vet inte varför du får att minKlass inte är deklarerad, för rent spontant så verkar du har gjort rätt.
Då jag använder mig av klasser vilket jag gör varje gång jag bygger aspx-sidor som har någon form av databaskoppling. Jag skapar en klass, vi döper den till cAccessConnection, som tar hand om OleDb.OleDbConnection, Dataset, OleDb.OleDbDataAdapter, samt den sträng, SqlStr , som jag hämtar min fråga ifrån en annan klass som representerar varje tabell som jag jag har i min DB. Varje gång jag skapar en klass så högerklickar jag på mitt projektnamn i Solution Explorer och väljer Add Class..
Alltså:
cAccessConnection (klass), denna klass ärver jag i varje ny klass som skall vara med i mitt projekt. Säg att jag har en tabell som håller data om billar.
Då skapar jag en klass som vi kallar cCars. I den här klassen ärver jag min connection-klass dvs
Public Class cCars
Inherits cAccessConn
Public Sub GetCars()
SqlStr = "SELECT * " & _
"FROM Cars"
Fill()
End Sub
End Class
I min Codebehind sedan så kan vi säga att jag vid pageload skall en datagrid laddas med info om mina bilar.
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
GetCars()
End Sub
Private Function GetCars()
Dim objCars As New cCars 'Deklarera ett objekt av klassen cCars
objCars.GetCars() ' Anropa din SQL-fråga i cCars-klassen
dgDinDatagrid.DataSource = objCars.ds
dgDinDatagrid.DataBind()
dgDinDatagrid.Dispose()
End Function
Inget vidare exempel kanske och jag vet inte om du blev något klokare?? Men i grova drag så är det så här jag gör då jag använder mig av klasser.
// Mvh Thomas
Sv:anropa en klass i codebehind
Det jag gjorde för fel var att jag inte hade paranteser efter "ForumClass" dvs
Dim minKlass As New ForumClass() istället för
Dim minKlass As New ForumClass
Jag undrar om du har tid å förklara för mig som nybörjare av asp.net
vilka fördelar man har när man använda klasser?
Som jag ser ditt exempel så skulle jag kunna koda allt det du gör utan att använda mig av klasser och skriva allt i codbehind....
Tack ännu en gång :-)Sv: anropa en klass i codebehind
Ja se hur enkelt det kan vara ibland...=)
Då ska vi se om jag kan förklara varför man ska/bör använda sig av klasser.
Du skrev att det såg ut som, i mitt exempel, att man lika gärna kunde göra allt i CodeBehind. Men som jag skrev så var kanske inte mitt exempel var det bästa. Hur som helst så skapar man klasser för att ge sig möjligheten att definiera egna objekt i ett projekt - alltså objekt med egenskaper, metoder och händelser.
Jag pratade om min Connection i min tidigare tråd. Där är också en stor fördel att ha kopplingen mot din databas på ett ända ställe iställe för att skapa kopplingar, med dataset, dataadaptrar etc hela tiden i din CodeBehind varje gång du skall göra en fråga mot en databas. Detta kan bli väldigt rörigt då du harkopplingar och frågor överallt i din CodeBehind.
Ska försöka förklara vad jag menar.
Jag skapar en klass som "tar hand om" kopplingen mot databasen.Så här ser det ut i mitt fall:
Public Class cAccessConn
Private AccessConn As New OleDb.OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & HttpContext.Current.Server.MapPath("./DB/DinDataBas.mdb"))
Private ads As New DataSet
Private ada As New OleDb.OleDbDataAdapter
Private aSqlStr As String
Protected ReadOnly Property Con() As OleDb.OleDbConnection
Get
Return AccessConn
End Get
End Property
Public ReadOnly Property ds() As DataSet
Get
Return ads
End Get
End Property
Public Property SqlStr() As String
Get
Return aSqlStr
End Get
Set(ByVal Value As String)
aSqlStr = Value
End Set
End Property
Public Sub Dispose()
AccessConn.Dispose()
ads.Dispose()
ada.Dispose()
End Sub
Public Sub Fill()
Dim Command As New OleDb.OleDbCommand
Command.CommandText = SqlStr
Command.Connection = AccessConn
ada.SelectCommand = Command
AccessConn.Open()
ada.Fill(ds)
AccessConn.Close()
End Sub
Protected Sub ExecNoQuery(ByVal sp As OleDb.OleDbCommand)
Try
AccessConn.Open()
Catch
End Try
sp.ExecuteNonQuery()
AccessConn.Close()
End Sub
End Class
Så ser alltså min Connection-klass ut som jag sedan ärver i den klass som jag sedan skapar då jag vill börja ställa frågor mot min databas.
Jag har ett exempel där följande gäller. På min sida för min firma http://www.ewc.se så kan jag logga in för att se om någon har postat ett inlägg in det kontakt-formulär som finns på sidan. När jag har loggat in på min admin så är det en datagrid som presenterar ev. inlägg.
Då jag har en tabell i min databas som heter Meddelanden så skapar jag mig en klass som jag kallar för cMessage i den klassen har jag följande:
Public Class cMessage
Inherits cAccessConn
Public Sub GetMessage()
SqlStr = "SELECT Id,FNamn, ENamn, Foretag, Tel, Meddelande, KortMeddelande, Datum " & _
"FROM Meddelanden "
Fill()
End Sub
Public Sub GetMessById(ByVal Id)
SqlStr = "SELECT Meddelande " & _
"FROM Meddelanden " & _
"WHERE Id = " & Id
Fill()
End Sub
Public Sub InsertMessege(ByVal FNamn, ByVal ENamn, ByVal Foretag, ByVal Tel, ByVal Epost, ByVal Meddelnade, ByVal KortMeddelande, ByVal DateNow)
SqlStr = "INSERT INTO Meddelanden(FNamn, ENamn, Foretag, Tel, Epost, Meddelande, KortMeddelande, Datum) " & _
"VALUES('" & FNamn & "', '" & ENamn & "', '" & Foretag & "', '" & Tel & "', '" & Epost & "', '" & Meddelnade & "', '" & KortMeddelande & "', '" & DateNow & "')"
Dim sp As New OleDb.OleDbCommand(SqlStr, Con)
ExecNoQuery(sp)
End Sub
End Class
Vad frågorna gör är av minder vikt men det jag vill att du ska se/förstå är att jag ärver min Connection-klass och på så vis använda mig av det som är inom den klassen dvs min koppling mot databasen. På detta vis så skapar jag "egenskaper" för min koppling bara 1! gång och sedan anropar jag den då jag ställer en fråga från mina klasser som motsvarar en tabell.
Om vi kikar lite i min klass cMassage så har jag en Sub som heter GetMessage. Denna hämtar ut mina meddelanden från mitt kontakta-formulär.
Koden i CodeBehid blir således enligt följande:
Private Function GetMessage()
Dim objMessage As New cMessage 'Här deklarerar jag mitt objekt av klassen cMessage
objMessage.GetMessage() 'Med punktnotation kommer jag åt den Sub som jag har i min klass
dgMessage.DataSource = GetMessage.ds ' ds kommer jag åt då jag har ärvt cAccessConn i min cMessage-klass
dgMessage.DataBind()
dgMessage.Dispose()
End Function
GetMessage() läggar jag givetvis under PageLoad.
Hoppas att jag inte har snurrat till dig för dig, men något åt det här hållet blir min förklaring till klasser. Sen kanske någon mer erfaren programmerare med djupgående kunskap om klasser skrattar åt min förklaring men som sagt detta är ett exepel på hur jag går till väga då jag använder klasser. För visst finns det mycket om klasser där man kan ärva basklasser osv men som sagt så här gör jag och jag hoppas på att du fick några uppslag.
// Mvh Thomas K
Sv:anropa en klass i codebehind
Ditt exempel är bra och jag börjar inse fördelarna med klasser. Speciellt om man ska återanvända koden.
tack ännu en gång...