Avatar billede disco_keld Nybegynder
21. februar 2003 - 14:28 Der er 55 kommentarer og
1 løsning

Hvordan henter men en textbox værdi ind i en seperat klasse?

Hejsa.........

Lige et spørgsmål omkring hvordan man henter en værdi fra en textbox ind i en "ikke" code-behind klasse, men i en ny klasse?

TextBoxenes variabel erklæringer, kan man jo ikke bare rykke med i den nye seperate klasse. De skal jo ligge i aspx filens code-behind klasse fil.

Nogen forslag? :-(

Mvh

DK
Avatar billede burningice Nybegynder
21. februar 2003 - 15:21 #1
din codebehindfil til aspx-siden:

Dinklasse dk = new Dinklasse();
dk.TextBoxVærdi = DinTextBox.Text;

Her opretter jeg en instans af din klasse, og smider værdien af din textbox ind i en variabel i klassen der hedder TextBoxVærdi.
Avatar billede disco_keld Nybegynder
21. februar 2003 - 15:24 #2
Hej Cyberfessor!!!!!!!!!!

Okay......... jeg prøver på mandag. Har fri nu.

Jeg har længe siddet og hævet mig håret over det der. Hehe.

Vi snakkes ved!

GO WEEKEND!!!!!!!!!!! :-)

Mvh

DK
Avatar billede burningice Nybegynder
21. februar 2003 - 15:30 #3
hejsa :) og god weekend... hehe... der er jo os andre der koder, selv i weekenderne ;)
Avatar billede lighterus Nybegynder
21. februar 2003 - 15:44 #4
Det er der jo nemlig :)
asp.net holder jo... er sq sjovt at programmere.
Avatar billede burningice Nybegynder
21. februar 2003 - 15:53 #5
lighterus>> det er ikke lige så ofte jeg får taget mig tid til at lave noget i asp.net :( udover her på eksperten. Al min tid går med at kode et winformprogram i c#... men hvad... meningen var da at få portet det til asp.net engang, så der skulle der være rig mulighed for at lege med det igen :)
Avatar billede disco_keld Nybegynder
24. februar 2003 - 09:21 #6
GO MORGEN!!!!! :-)

Dinklasse dk = new Dinklasse();

Cyberfessor den klasse du laver en ny instans af er det den klasse her:

Public Class Dinklasse?

eller:

Inherits Dinklasse?

altså den man arbejder i, hvor Page_Load ligger eller er det den klasse man nedarver fra man laver en ny instans af?
Avatar billede disco_keld Nybegynder
24. februar 2003 - 10:15 #7
Jeg kan ikke få det til at virke! :-(

Jeg har prøvet sådan her:

Dim updateUser As UserManagement = New UserManagement()
UserManagement.txtCompanyValue = txtCompany.Text

Men den siger at "txtCompanyValue", "is not a member of" klassen.......

Den her: "Protected WithEvents txtCompany As System.Web.UI.WebControls.TextBox"

skal selvfølgelig være på code-behind filen ikke?
Avatar billede burningice Nybegynder
24. februar 2003 - 12:31 #8
UserManagement... det er en klasse du selv har lavet, ikk'?
Avatar billede disco_keld Nybegynder
24. februar 2003 - 12:33 #9
yep!
Avatar billede burningice Nybegynder
24. februar 2003 - 12:49 #10
jamen... så burde du da også have styr på dens interne virkemåde??

har du en public variabel eller property der hedder txtCompanyValue ??
Avatar billede disco_keld Nybegynder
24. februar 2003 - 12:56 #11
Ja ja........ jeg forstår.

Men i min klasse har jeg ikke defineret txtCompanyValue.

Hvordan skal min Property se ud?
Avatar billede disco_keld Nybegynder
24. februar 2003 - 13:02 #12
Tilbage til de dejlige properties og konstruktører!

Dem er jeg ikke helt så skape i.

Hvis du vil hjælpe mig med at forklare hvordan og hvorfor så skal du nok få nogle ekstra pointzzzzz..
Avatar billede disco_keld Nybegynder
24. februar 2003 - 13:10 #13
Jeg har gjort sådan her:

Private TextBox1 As String

    Public Property txtCompanyValue() As String
        Get
            txtCompanyValue = TextBox1
        End Get
        Set(ByVal Value As String)
            TextBox1 = Value
        End Set
    End Property

Skal jeg så ikke kunne kalde den i min codebehind således:

UserManagement.TextBox1 = txtCompany.Text

eller sådan:

UserManagement.txtCompanyValue = txtCompany.Text

Den siger stafig fejl begge steder?
Avatar billede disco_keld Nybegynder
24. februar 2003 - 13:23 #14
hvad betyder:

"Refernce to a non-shared member, requires an object.reference"

?
Avatar billede burningice Nybegynder
24. februar 2003 - 13:31 #15
uhm... din property ser god nok ud... tror jeg nok, jeg er ikke så hård i vb.net-syntaksen
dog skal sætte txtCompanyValue til noget og ikke TextBox1, da den jo er private...


meeen.. jeg har dog lige set en stor fejl du har lavet... du skal ikke skrive UserManagement.txtCompanyValue med updateUser.txtCompanyValue da det jo er objectet du skal referere til og ikke klassen (det er kun når ens metoder/properties er shared man kan referere til klassen). Og når det er sagt, tror du ikke du skulle tage og læse nogle tutorials? der er nogle gode på www.gotdotnet.com

http://samples.gotdotnet.com/quickstart/
Avatar billede disco_keld Nybegynder
24. februar 2003 - 13:38 #16
Hehe.............. okey.

Jeg tjekker de tutorials ud der. Men bare fordi jeg ikke lige har brugt properties før cyberfessor! Altså......... ;-) hehe

Lige 2 ting:

Hvorfor skulle man kunne refere til en klasse? >> (det er kun når ens metoder/properties er shared man kan referere til klassen)
i stedet for objektet?

Og hvis jeg laver den der Textbox1 der til en Public string, er den så som den skal være?

SÅdan her:

Public TextBox1 As String

    Public Property txtCompanyValue() As String
        Get
            txtCompanyValue = TextBox1
        End Get
        Set(ByVal Value As String)
            TextBox1 = Value
        End Set
    End Property

Og:

Dim updateUser As UserManagement = New UserManagement()
updateUser.txtCompanyValue = txtCompany.Text
Avatar billede burningice Nybegynder
24. februar 2003 - 13:45 #17
det tager tid at oprette et object i hukommelsen så nogen gange kan det være en fordel at lave en funktion shared. På den måde behøver man ikke nogen reference til et object. Du tænker nok ikke over det, men når du f.eks. skriver int.Parse eller Math.Rnd så tilgår du metoderne Parse og Rnd i klasserne int og Math... og i og med at de metoder er shared, så behøver du ikke at skrive f.eks.

Dim i As int = new int()
i.Parse

ang. den kode du har skrevet til sidst i din kommentar, så ser den rigtig ud :)
Avatar billede disco_keld Nybegynder
24. februar 2003 - 14:11 #18
Okay........

thnx!

Men hvad så hvis det er en Output parameter fra en SPROC?

hvordan initialisere jeg den så?

Det kode her er fra min funktion i UserUpdate klassen:

Public ReadOnly Property OutPut1Value() As String
        Get
            OutPut1Value = OutPut1
        End Get
    End Property

'output
Dim parameterOutput As New SqlParameter("@Result", SqlDbType.Int, 4)
myCommand.Parameters.Add(parameterOutput)
parameterOutput.Direction = ParameterDirection.Output


Og her sammen med de andre initialiseringer:

updateUser.txtAddedDateValue = txtAddedDate.Text
updateUser.OutPut1Value = ????

Det er fordi jeg har denne her i min sub:

Dim intResult As Integer = CInt(myCommand.Parameters("@Result").Value)

Og da det nu ligger i min funktion, ved jeg ikke lige hvordan jeg skal omkode det?

Skal jeg oprette et nyt spm?
Avatar billede disco_keld Nybegynder
24. februar 2003 - 14:43 #19
Kom med et svar!

Så opretter jeg et nyt spm til den med output parameteren.

Mvh

DK
Avatar billede burningice Nybegynder
24. februar 2003 - 15:48 #20
æææh.. jeg er ikke med... outputvalue er da ikke noget der skal sættes til noget ??

MessageBox.Show(updateUser.OutPut1Value.ToString())

sårn, ikk?
Avatar billede burningice Nybegynder
24. februar 2003 - 15:48 #21
svar
Avatar billede disco_keld Nybegynder
24. februar 2003 - 15:52 #22
Nej......... den output SPROC parameter er for at tjekke om der er fejl under opdateringen. Har lavet en Transaction.

> 0 = ingen fejl,

0 = fejl

-1 = fejl

Før så min kode sådan her ud:

Dim intResult As Integer = CInt(myCommand.Parameters("@Result").Value)
                Dim strResult As String = "Resultat=" & CStr(intResult) & "<br /><br />"    '** udskriver resultatet -1, 0 eller 1 **

                'select case ud fra en af disse
                'output parametre: -1, 0 eller 1
                Select Case intResult
                    Case -1 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet opdateret!</font>"

                    Case 0 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet opdateret!</font>"

                    Case Is > 0 : strResult += "<font style=""color:green;"">Bruger dataene blev opdaterede korrekt!</font>"
                End Select

Men jeg kan jo ikke bruge dennne her mere:

Dim intResult As Integer = CInt(myCommand.Parameters("@Result").Value)
´da det ligger i min funktion i klassen.
Avatar billede burningice Nybegynder
24. februar 2003 - 16:02 #23
så er det vel...

Dim intResult As Integer = CInt(updateUser.OutPut1Value)
Dim strResult As String = "Resultat=" & CStr(intResult) & "<br /><br />"    '** udskriver resultatet -1, 0 eller 1 **

                'select case ud fra en af disse
                'output parametre: -1, 0 eller 1
                Select Case intResult
                    Case -1 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet opdateret!</font>"

                    Case 0 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet opdateret!</font>"

                    Case Is > 0 : strResult += "<font style=""color:green;"">Bruger dataene blev opdaterede korrekt!</font>"
                End Select
Avatar billede coolstar Nybegynder
27. februar 2003 - 09:44 #24
vil det sige at asp snart erstattes af asp.net ???
Avatar billede disco_keld Nybegynder
27. februar 2003 - 10:06 #25
>> coolstar,-

WHAT!!!!!!!!

Erstatte........ hvad mener du? Glem alt om klassisk asp, php og hvad der ellers findes af tingel tangel!

asp 3.0 er røv og nøgler hvis du absolut vil holde det op mod asp.net! :-)
Avatar billede disco_keld Nybegynder
27. februar 2003 - 10:07 #26
>> cybercfessor........... jeg har lavet det på en anden måde.

Jeg viser dig/jer lige hvordan lidt senere. Det er for fed........ :-)
Avatar billede burningice Nybegynder
27. februar 2003 - 11:16 #27
disco_keld>> hehe... rolig nu... asp.net er altså ikke svaret på alle verdens problemer. I teorien kan du ikke lave noget i asp.net som du ikke kan i asp, eller php for den sags skyld. dog er man som udvikler rimelig godt stillet med det framework og måden sin kode bliver kørt på med asp.net, som gør det utrolig nemt at skrive effektiv, ren og overskuelig og kode som er nem at genbruge :)
Avatar billede disco_keld Nybegynder
27. februar 2003 - 11:25 #28
det var såmen bare det her jeg vil frem til!

>> effektiv, ren og overskuelig og kode!

Det er verdens fedeste ting. Og husk lige at asp 3.0 samt de andre skal compilers hver gang man reuqester en side.

Så øget performance på .NET og større sikkerhed er vel også et "mindre" plus!

Hvad er det for et C# winform prog. du er ved at kode cyberfessor?
Avatar billede disco_keld Nybegynder
27. februar 2003 - 11:40 #29
Jeg  har lavet det på den måde her.

Det eneste jeg er i tvivl om er om min metode "AddNewUser" skal returnere et Integer i stedet for objektet "CreateNewUser".

Vil du ikke lige vise mig hvordan?

Plus den label der, der ligger i samme metode også. Den ved jeg heller ikke hvordan jeg skal omkode, så jeg kan tilgå den fra min code-behind class.

Her er min Usermanagement class:
-----------------------------------------------------------------
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Reflection
Imports SecurityLib

Public Class CreateNewUser
    Public TextBox1 As String
    Public TextBox2 As String
    Public TextBox3 As String
    Public TextBox4 As String
    Public DropList As Integer
    Public OutPut As Integer
End Class

Public Class UserManagement
    Inherits DbClass

    'tilføj en ny bruger
    Public Function AddNewUser(ByVal ddlUserRightsValue As Integer, ByVal txtCompanyValue As String, ByVal txtUserNameValue As String, ByVal txtEmailValue As String, ByVal txtPasswordValue As String) As CreateNewUser
        Dim con As New SqlConnection(connectionString)

        Dim cmd As New SqlCommand("sp_GetUserLoginSpecs", con)
        'cmd.CommandType = CommandType.StoredProcedure

        'parameter til et email tjek længere nede
        'cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = txtEmailValue

        Try
            'åbner conn til Db
            If con.State <> ConnectionState.Open Then
                con.Open()
            End If

            'tjekker om email adressen allerede findes i Db
            'Dim reader As SqlDataReader = cmd.ExecuteReader()
            'If reader.Read = True Then
            'blblMsg.Text = "<ul><li>Der findes allerede en bruger med denne email-adresse!</li></ul>"
            'blblMsg.ForeColor = Color.Red
            'blblMsg.Font.Bold = False
            'con.Dispose()
            'con.Close()
            'Exit Try
            'Else
            'reader.Close()

                'Tilføj bruger i Db tabel User_Accounts
                cmd = New SqlCommand("sp_UserAdd", con)
                cmd.CommandType = CommandType.StoredProcedure

                'input parametre til tilføjelse af det nye bruger data
                cmd.Parameters.Add("@Company", SqlDbType.NVarChar, 50).Value = txtCompanyValue

                cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = txtUserNameValue

                cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = txtEmailValue

                cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = PasswordHasher.Hash(txtPasswordValue)

                cmd.Parameters.Add("@UserRights", SqlDbType.Int, 4).Value = ddlUserRightsValue

                cmd.Parameters.Add("@AddedDate", SqlDbType.DateTime, 8).Value = System.DateTime.Now

                'output
                cmd.Parameters.Add("@Result", SqlDbType.Int, 4).Direction = ParameterDirection.Output

                cmd.ExecuteNonQuery()
            'End If
        Catch
            Throw
        Finally
            If con.State <> ConnectionState.Closed Then
                con.Dispose()
                con.Close()
            End If
        End Try

        Dim addUser As New CreateNewUser()
        addUser.TextBox1 = cmd.Parameters("@Company").Value.ToString()
        addUser.TextBox2 = cmd.Parameters("@Name").Value.ToString()
        addUser.TextBox3 = cmd.Parameters("@Email").Value.ToString()
        addUser.TextBox4 = cmd.Parameters("@Password").Value.ToString()
        addUser.DropList = CType(cmd.Parameters("@UserRights").Value, Integer)
        addUser.OutPut = CType(cmd.Parameters("@Result").Value, Integer)

        Return addUser
    End Function

End Class
------------------------------------------------------------------------------

Og her kommer min code-behind class:

Public Sub btnNewUser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNewUser.Click
        If IsValid Then
            If CInt(Context.Session("TP_UserRights")) <> 1 Then
                With blblError
                    .Text = "<ul><li>Du har ikke rettigheder til at tilføje data i databasen!</li></ul>"
                    .ForeColor = Color.Red
                    .Visible = True
                End With
            Else
                Dim txtCompanyValue As String = bTxtCompany.Text
                Dim txtUserNameValue As String = bTxtUserName.Text
                Dim txtEmailValue As String = bTxtEmail.Text
                Dim txtPasswordValue As String = bTxtPassword.Text
                Dim ddlUserRightsValue As Integer = CType(bDdlUserRights.SelectedItem.Value, Integer)

                Dim userManagement As UserManagement = New UserManagement()
                Dim createNewUser As CreateNewUser = New CreateNewUser()
                createNewUser = userManagement.AddNewUser(ddlUserRightsValue, txtCompanyValue, txtUserNameValue, txtEmailValue, txtPasswordValue)                'fanger værdien af output parameteren fra @Result

                Dim intResult As Integer = createNewUser.OutPut
                Dim strResult As String '= "Resultat=" & CStr(intResult) & "<br /><br />"    '** udskriver resultatet -1, 0 eller 1 **

                'select case ud fra en af disse
                'output parametre: -1, 0 eller 1
                Select Case intResult
                    Case -1 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet tilføjet!</font>"

                    Case 0 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet tilføjet!</font>"

                    Case Is > 0 : strResult += "<font style=""color:green;"">Bruger dataene blev tilføjet korrekt!</font>"
                End Select

                'sætter Session til UserRights fra Db, til senere brug.
                'ellers ville den være 0
                Dim userRights As Integer
                userRights = Convert.ToInt32(Context.Session("TP_UserRights"))

                'udskiver resultat til label
                bLblMsg.Text = "<br /><br /><br /><center>" & strResult & "</center>"
                bLblMsg.Font.Bold = True

                bLblMsgRedirect.Text = "<center><br /><br />Du bliver redirected tilbage,- et øjeblik<img src=""../Images/loader.gif"" valign=""bottom"" /></center>"
                bLblMsgRedirect.ForeColor = Color.Black

                pnlNewUser.Visible = False

                Response.AppendHeader("Refresh", "5;URL=http://192.168.5.75/TPNet/Secure/Admin.aspx")
            End If
        End If
    End Sub 'btnNewUser_Click
Avatar billede burningice Nybegynder
27. februar 2003 - 12:02 #30
nu ved jeg jo ikke ikke hvordan dit site er bygget op, dog ser det nogenlunde ok ud... en ting jeg dog ikek forstår, og det er hvad du skal bruge CreateNewUser-klassen til ?!?!?! jeg mener, du returnerer en instans af den klasse, men bruger den ikke til noget, ud over den der OutPut-variabel
Avatar billede disco_keld Nybegynder
27. februar 2003 - 12:07 #31
jo........ jeg pakker de parametre ind i et samlede objekt/klasse, som jeg så kan lave en ny instans af også. Her:

Dim createNewUser As CreateNewUser = New CreateNewUser()
createNewUser = userManagement.AddNewUser(ddlUserRightsValue, txtCompanyValue, txtUserNameValue, txtEmailValue, txtPasswordValue)

Er det ikke lige så fedt at gøre som at lave en masse properties som indeholder parametrene?

Den label der, der ligger i samme metode også. Den ved jeg heller ikke hvordan jeg skal omkode, så jeg kan tilgå den fra min code-behind class?? :-(
Avatar billede burningice Nybegynder
27. februar 2003 - 12:18 #32
for det første så er det bedst at bruge en struct hvis dit object kun skal indeholde en række variabler...

men ville det ikke være nemmere enten at skrive

Dim createNewUser As CreateNewUser = userManagement.AddNewUser(ddlUserRightsValue, txtCompanyValue, txtUserNameValue, txtEmailValue, txtPasswordValue)

eller bare at lade AddNewUser returnere et tal istedet, da OutPut er jo den eneste variabel i createNewUser som du bruger til noget ?
Avatar billede disco_keld Nybegynder
27. februar 2003 - 12:36 #33
hvis jeg bare skal lade AddNewUser returnere et tal, skal min metode så se således ud:

Public Function AddNewUser(ByVal ddlUserRightsValue As Integer, ByVal txtCompanyValue As String, ByVal txtUserNameValue As String, ByVal txtEmailValue As String, ByVal txtPasswordValue As String) As Integer
        Dim con As New SqlConnection(connectionString)

        Dim cmd As New SqlCommand("sp_GetUserLoginSpecs", con)
        'cmd.CommandType = CommandType.StoredProcedure

        'parameter til et email tjek længere nede
        'cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = txtEmailValue

        Try
            'åbner conn til Db
            If con.State <> ConnectionState.Open Then
                con.Open()
            End If

            'tjekker om email adressen allerede findes i Db
            'Dim reader As SqlDataReader = cmd.ExecuteReader()
            'If reader.Read = True Then
            'blblMsg.Text = "<ul><li>Der findes allerede en bruger med denne email-adresse!</li></ul>"
            'blblMsg.ForeColor = Color.Red
            'blblMsg.Font.Bold = False
            'con.Dispose()
            'con.Close()
            'Exit Try
            'Else
            'reader.Close()

                'Tilføj bruger i Db tabel User_Accounts
                cmd = New SqlCommand("sp_UserAdd", con)
                cmd.CommandType = CommandType.StoredProcedure

                'input parametre til tilføjelse af det nye bruger data
                cmd.Parameters.Add("@Company", SqlDbType.NVarChar, 50).Value = txtCompanyValue

                cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = txtUserNameValue

                cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = txtEmailValue

                cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = PasswordHasher.Hash(txtPasswordValue)

                cmd.Parameters.Add("@UserRights", SqlDbType.Int, 4).Value = ddlUserRightsValue

                cmd.Parameters.Add("@AddedDate", SqlDbType.DateTime, 8).Value = System.DateTime.Now

                'output
                cmd.Parameters.Add("@Result", SqlDbType.Int, 4).Direction = ParameterDirection.Output

                cmd.ExecuteNonQuery()
            'End If
        Catch
            Throw
        Finally
            If con.State <> ConnectionState.Closed Then
                con.Dispose()
                con.Close()
            End If
        End Try

      Return ?
    End Function

Hvad så med den label der længere opppe?

Vil du ikke lige vise mig det?
Avatar billede burningice Nybegynder
27. februar 2003 - 13:13 #34
Return CType(cmd.Parameters("@Result").Value, Integer)

Hvad er det for en label du snakker om?
Avatar billede disco_keld Nybegynder
27. februar 2003 - 13:19 #35
hvad så her:

Dim userManagement As UserManagement = New UserManagement()
userManagement.AddNewUser(ddlUserRightsValue, txtCompanyValue, txtUserNameValue, txtEmailValue, txtPasswordValue)

Dim intResult As Integer = userManagement    ??????
Dim strResult As String '= "Resultat=" & CStr(intResult) & "<br /><br />"    '** udskriver resultatet -1, 0 eller 1 **

                'select case ud fra en af disse
                'output parametre: -1, 0 eller 1
                Select Case intResult
                    Case -1 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet tilføjet!</font>"

                    Case 0 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata er blevet tilføjet!</font>"

                    Case Is > 0 : strResult += "<font style=""color:green;"">Bruger dataene blev tilføjet korrekt!</font>"
                End Select
Avatar billede disco_keld Nybegynder
27. februar 2003 - 13:21 #36
jeg er fuldstændig lost mand.....

vil du ikke smide hele funktionen her?
Avatar billede burningice Nybegynder
27. februar 2003 - 13:27 #37
fårk du tåger mand... har du seriøst selv lavet din UserManagement-klasse?


Dim userManagement As UserManagement = New UserManagement()
Dim intResult As Integer = userManagement.AddNewUser(ddlUserRightsValue, txtCompanyValue, txtUserNameValue, txtEmailValue, txtPasswordValue)
Avatar billede disco_keld Nybegynder
27. februar 2003 - 13:35 #38
tak.....

ja jeg har selv lavet den klasse der. Men giv mig lige lidt tid fessor. Hvis jeg havde styr på alt, så havde jeg jo ikke noget at gøre her vel!

:-)
Avatar billede disco_keld Nybegynder
27. februar 2003 - 13:39 #39
eh........

hvad med update og delete? Hvilken fremgangsmåde skal jeg bruge der så?

Den reader og label jeg snakker om er den her:

'tjekker om email adressen allerede findes i Db
Dim reader As SqlDataReader = cmd.ExecuteReader()
If reader.Read = True Then
blblMsg.Text = "<ul><li>Der findes allerede en bruger med denne email-adresse!</li></ul>"
blblMsg.ForeColor = Color.Red
blblMsg.Font.Bold = False
con.Dispose()
con.Close()
Exit Try
Else
reader.Close()

......................
Avatar billede disco_keld Nybegynder
27. februar 2003 - 13:48 #40
du må ikke sige sådan noget fessor.....

nu er jeg ked af det! :-(

jeg prøver jo alt det jeg kan...........................
Avatar billede burningice Nybegynder
27. februar 2003 - 13:49 #41
disco_keld>> nej nej... selvfølgelig ikke... men du gør jo brug af mange ting i din klasse som ligger på et lidt højere niveau... så jeg ville bare gå ud fra at hvis du har forstået alt det der sker i din klasse, så ville du også vide hvad du skulle returnere :)

ang. delete skal du bruge en ExecuteNonQuery, og ligeså med en update... personligt bruger jeg aldrig en reader, synes det er noget snask...
du skal forresten heller ikke blande designet ind i din klasse... kast hellere en exception... altså

'tjekker om email adressen allerede findes i Db
Dim reader As SqlDataReader = cmd.ExecuteReader()
If reader.Read = True Then
  throw new Exception()
con.Dispose()
con.Close()
Exit Try
Else
reader.Close()

og ude på din codebehind skruver du så

try
  Usermanagement.Update(blabla)
catch (Exception)
  blblMsg.Text = "<ul><li>Der findes allerede en bruger med denne email-adresse!</li></ul>"
blblMsg.ForeColor = Color.Red
blblMsg.Font.Bold = False
End try
Avatar billede disco_keld Nybegynder
27. februar 2003 - 13:56 #42
>> CF...... jeg læser i døgndrift i mine wrox bøger om Class design ovs.

Så jeg bruger meget tid på det, men det er stadig lige så nyt for mig som da jeg syntes html var svært.

Jeg skal lige lære at gennemskue hvilke ting der kalder hvad og hvilke ting der retunere hvad ovs ovs.

Men fuck hvor er det fedt......... mand.

Men du har ret, jeg kludrer lidt i det eller blander lidt ting sammen.

Jeg ved godt man skal bruge ExecuteNonQuery hvis ikke der skal returneres noget. Men jeg tænkte nu mere på min fremgangsmåde m.h.t. at smide parametre i en klasse for sig, og smide det frem og tilbage?

Hvornår ville du bruge den fremgangs måde?
Avatar billede disco_keld Nybegynder
27. februar 2003 - 14:07 #43
den fanger fint exeptionen der der , men den viser en fejl meddelse og ikke min label! :-(

hvad gør jeg galt:

If reader.Read = True Then
                Throw New Exception()
                con.Dispose()
                con.Close()
                Exit Try
            Else

-----------------------------------------------------------------

Try
                    Dim userManagement As UserManagement = New UserManagement()
                    Dim intResult As Integer = userManagement.DeleteUserData(ddlUsersValue)
                    Dim strResult As String '= "Resultat=" & CStr(intResult) & "<br /><br />"    '** udskriver resultatet -1, 0 eller 1 **

                    'hvis SPROC returnere et -1 eller 0 "error". hvis > 0 så gennemfør trans.
                    Select Case intResult
                        Case -1 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata blev slettet!</font>"

                        Case 0 : strResult += "<font style=""color:red;"">Der skete en fejl, og ingen brugerdata blev slettet!</font>"

                        Case Is > 0 : strResult += "<font style=""color:green;"">Bruger dataene blev slettet korrekt!</font>"
                    End Select
                Catch ex As Exception
                    bLblMsg.Text = "<ul><li>Der findes allerede en bruger med denne email-adresse!</li></ul>"
                    bLblMsg.ForeColor = Color.Red
                    bLblMsg.Font.Bold = False
                End Try
Avatar billede burningice Nybegynder
27. februar 2003 - 14:09 #44
hvad er det for en fejlmeddelelse der kommer?
Avatar billede disco_keld Nybegynder
27. februar 2003 - 14:13 #45
Exception of type System.Exception was thrown.


Line 77:            Throw

sært nok, for det er i den anden try block i funktionen den fanger den.

Spørgsmålet er om det her:

Catch ex As Exception

fanger det her:

If reader.Read = True Then
                Throw New Exception()
                con.Dispose()
                con.Close()
                Exit Try
            Else
Avatar billede burningice Nybegynder
27. februar 2003 - 14:36 #46
du mangler ikke noget end catch eller sådan noget?
Avatar billede disco_keld Nybegynder
27. februar 2003 - 14:43 #47
nu ved jeg det......... prøv og se her:

Try
            'åbner conn til Db
            If con.State <> ConnectionState.Open Then
                con.Open()
            End If

            'tjekker om email adressen allerede findes i Db
            Dim reader As SqlDataReader = cmd.ExecuteReader()
            If reader.Read = True Then
                Throw New Exception()
                con.Dispose()
                con.Close()
            Else
                reader.Close()

                'Tilføj bruger i Db tabel User_Accounts
                cmd = New SqlCommand("sp_UserAdd", con)
                cmd.CommandType = CommandType.StoredProcedure

                'input parametre til tilføjelse af det nye bruger data
                cmd.Parameters.Add("@Company", SqlDbType.NVarChar, 50).Value = txtCompanyValue

                cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = txtUserNameValue

                cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = txtEmailValue

                cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = PasswordHasher.Hash(txtPasswordValue)

                cmd.Parameters.Add("@UserRights", SqlDbType.Int, 4).Value = ddlUserRightsValue

                cmd.Parameters.Add("@AddedDate", SqlDbType.DateTime, 8).Value = System.DateTime.Now

                'output
                cmd.Parameters.Add("@Result", SqlDbType.Int, 4).Direction = ParameterDirection.Output

                cmd.ExecuteNonQuery()
            End If
        Catch
            Throw
        Finally
            If con.State <> ConnectionState.Closed Then
                con.Dispose()
                con.Close()
            End If
        End Try

når du laver et Throw i If sætningen der, som i forvejen ligger i en Try block så er det jo den Catch der fanger den, og ikke den der ligger i code-behind filen!

Hehe........

Hvordan kommer jeg udenom den
Avatar billede burningice Nybegynder
27. februar 2003 - 14:48 #48
du skal kaste nogle forskellige slags exceptions.. på den måde kan du skrive

catch (ditten)

catch (datten)

for på den måde at kunne skrive en bedre fejlhåndteringsmetode
Avatar billede disco_keld Nybegynder
27. februar 2003 - 14:56 #49
fuck jeg er idiot mand!

Havde smidt catch blokken i en forkert rutine!

spasser jeg er mand!

Cyberfessor! Jeg takker for din tid igen! :-)

Jeg vil lige hjem og læse lidt i min PROF ASP.NET bog fra Wrox om try catch blocks and shit!

kender du det forlag der hedder wrox?

du for lige lidt points fessor! ;-)
Avatar billede burningice Nybegynder
27. februar 2003 - 15:10 #50
joh.. det gør jeg da... jeg er selv igang med at læse den der hedder Proffessional C#, og har også Profession ASP.Net fra det forlag... :)

håber at du fik det til at virke... og lært lidt... det er jo det det eksperten.dk handler om :)
Avatar billede disco_keld Nybegynder
27. februar 2003 - 15:18 #51
det er verdens bedste bøger mand!

jeg fik "lidt" mere indsigt i tingene, må jeg sige!

men en ting du ikke har svaret mig på:

hvornår ville du wrap de parametre der ind i en klasse for sig?

hvis jeg havde lidt flere points, så havde du sgu fået nogen flere.

Tak for hjælpen........... ;-)
Avatar billede burningice Nybegynder
27. februar 2003 - 15:46 #52
disco_keld>> uhm...

altså, tænker du på den der NewUser-klasse du lavede? i så fald var ideen god nok, hvis du altså rent faktisk skulle bruge de værdier der var i NewUsers variabler... som jeg så det skulle du kun bruge OutPut til noget, og derfor var der ikke rigtig nogen grund til at gemme på så meget information.

Et oplagt et eksempel kunne være en vektor, som f.eks. består af to tal... man kunne derfor med fordel oprette følgende type

struct Vector {
  public int x;
  public int y;

  public Vector(int x, int y) {
      this.x = x;
      this.y = y;
  }
}

grunden til at jeg har oprettet den som struct og ikke class, er at struct er en value-type og derfor opbevares på stack'en som er meget hurtigere end heap'en hvor f.eks. klasser befinder sig.

Et andet eksempel kunne være en person...

struct Person {
  public string Navn;
  public int Alder;

  public Person(string Navn, int Alder) {
      this.Navn = Navn;
      this.Alder = Alder;
  }
}

lad os så sige at vi har en funktion i din UserManagement-klasse der tilføjer en person til databasen... den funktion kunne så se sådan her ud:

public void AddPerson(Person p) {
  string sql = "INSERT INTO personer (navn, alder) VALUES ('"+ p.Navn +"', "+ p.Alder +"");
  ExecuteNonQuery(sql);
}

håber at det afklarede nogle ting, ellers er du altid velkommen at kontakte mig enten via eksperten.dk, icq eller mail :)
Avatar billede disco_keld Nybegynder
03. marts 2003 - 09:09 #53
Yo....

Undskyld den lange svar tid! :-(

Tak for eksemplet Cyberfessor! Det var kanon, det eneste jeg ikke lige er med på, er den sætning her:

"grunden til at jeg har oprettet den som struct og ikke class, er at struct er en value-type og derfor opbevares på stack'en som er meget hurtigere end heap'en hvor f.eks. klasser befinder sig" ?

du nævner sgu nogen ting som godt lige vil vide hvad betyder! ;-)

f.eks.:

- struct er en value-type ?

- opbevares på stack'en ?

- end heap'en ?
Avatar billede burningice Nybegynder
03. marts 2003 - 09:37 #54
kaay... det er nu ellers nogle vigtige begreber at kunne hvis man vil udvikle nogle applikationer der yder bare nogenlunde.

valuetypes er typer som opbevares på stacken, mens referencetypes befinder sig på heapen. Både stack og heap er hukommelsen, mens forskellen på dem er hastigheden, hvor stack er det hurtigste. At oprette en instans af en klasse tager også længere tid og er i det hele taget langt mere kompleks end det er at oprette en valuetype.

En anden ting man skal være opmærksom på er måden hvorpå de virker når man tildeler en variabel til en anden... tag f.eks. følgende

int i = 10;
int x = i;
x += 50;
//i indeholder nu 10, og x indeholder 60

Hvis du istedet opretter en instans af en klasse, så forholder det sig anderledes (vi lader lige som om at min Vector-struct, er en class istedet);

Vector i = new Vector(10, 10);
Vector u = i;
u.x = 20;
u.y = 20;
//hovsa... nu indeholder båder i og u værdierne 20,20
Avatar billede disco_keld Nybegynder
03. marts 2003 - 09:57 #55
Hehe......... okay. Jeg har sikkert læst henover det her, eller var gået i koma.
Jeg kan lige så godt lægge bogen fra mig, efter 10 min. når jeg er hoppet i boxen. For jeg kan ikke huske halvdelen af det alligelvel. Hehe...

Cool nok,- ikke grine nu fessor :-)

valuetypes = ByVal

referencetypes = ByRef

hvorfor er Stack hurtigst?

du siger at det forholder sig anderledes hvis man laver en ny instans af en class. Vil du ikke lige definere hvad du mener med det?
Avatar billede burningice Nybegynder
03. marts 2003 - 11:29 #56
stack er hurtigst fordi at den ikke bliver fragmenteret... værdier i stacken bliver nedlagt i samme rækkefølge som de bliver oprettet, så derfor skal .Net runtimen ikke holde styr på andet end en stackpointer, som er et tal som refererer til næste sted i stacken som er fri. Når du f.eks. opretter en int-variable bliver der smidt 32 bytes i stacken, stackpointeren stiger med 32 bytes, og når variablen går ud af scope falder stackpointeren igen med 32 bytes.
Heapen er lidt mere indviklet, da en .Net runtimen jo ikke kan vide hvor meget en klasse fylder. Derfor skal den søge hukommelsen igennem efter et frit område som er lige så stort som den pågældende klasse fylder. Det er dog heldigvis ikke så slemt som det var i "gamle dage", da Garbage Collectoren sørger for at defragmentere hukommelsen af og til.

Grunden til at eksemplet som jeg viste forholdt sig som det gjorde er følgende:

når jeg skriver int x = i, så bliver VÆRDIEN af i KOPIERET til x. Dvs at x indeholder tallet 10, og når jeg lægger 50 til indeholder x 10+50 = 60. i indeholder dog stadigvæk 10.
I ekspemplet med klassen, bliver bliver REFERENCEN (altså adressen til hvor den befinder sig på heapen) til i KOPIERET til u. Dvs at u og i faktisk refererer til samme sted i hukommelsen. Det gør at når jeg sætter u.x til 20, så bliver i.x også sat til 20.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester