Avatar billede torpmikkelsen Juniormester
13. maj 2007 - 11:38 Der er 36 kommentarer og
1 løsning

Hente værdier fra form - send mail - indsæt i database

Jeg har lavet et "detailsView" i "Visual Web Developer 2005" som jeg bruger som input form.

Den skal sende en mail, med de indtastede informationer samt smide dem ind i en database.

Det der er mit problem er, at finde ud af hvordan jeg gør det nemmest/smartest, samt at få kontakt til de indtastede informationer, så jeg kan sende dem i en mail.

Kan jeg sende mailen "on the fly", eller skal jeg hente datafelterne fra databasen, efter at de er indsat via detailsView'et.
Avatar billede neoman Novice
13. maj 2007 - 12:33 #1
næh du kan sagtens få fat i felterne fra din detailsview direkte. Helt præcist hvordan  kommer lidt an på om du bruger templates ellerej. Prøv at kigge på denne artikel http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview.rows(VS.80).aspx

og hvis du kører fast, så smid lige ASPX-delen for din detailsview ind her så kan vi nok hitte en måde at tilgå data på
Avatar billede torpmikkelsen Juniormester
13. maj 2007 - 12:56 #2
Hej igen... du er over det hele :o)

Fedt du gider at hjælpe igen.

DetailsView:
----------------------------------------
<asp:DetailsView ID="BookingForm" runat="server" Height="50px" Width="360px" AutoGenerateRows="False" DataSourceID="InsertData" DefaultMode="Insert" Visible="False">
            <Fields>
                <asp:BoundField DataField="costumerName" HeaderText="Firmanavn" />
                <asp:BoundField DataField="costumerAddress" HeaderText="Adresse" />
                <asp:BoundField DataField="costumerZip" HeaderText="Postnr." />
                <asp:BoundField DataField="costumerTown" HeaderText="By" />
                <asp:BoundField DataField="costumerContact" HeaderText="Kontaktperson" />
                <asp:BoundField DataField="costumerPhone" HeaderText="Tlf." />
                <asp:BoundField DataField="costumerEmail" HeaderText="E-mail" />
                <asp:BoundField DataField="comment" HeaderText="Kommentar" />
                <asp:CommandField CancelText="" InsertText="Bekr&#230;ft Booking" ShowInsertButton="True" />
            </Fields>
        </asp:DetailsView>


Mail:
-----------------------------------
'Dim AdminMail As New MailMessage()
    'AdminMail.To = "mail@torpmedia.dk"
    'AdminMail.From = companyEmail.Text
    'AdminMail.BodyFormat = MailFormat.Text
    'AdminMail.Priority = MailPriority.Normal
    'AdminMail.Subject = "Booking option"
    'AdminMail.Body = companyName.Text & " ønsker at booke " & availableStaffGrid.SelectedValue & " d. " & Calendar.SelectedDate & vbCrLf & vbCrLf & _
    '              "Bookingoplysninger:" & vbCrLf & _
    '              companyName.Text & vbCrLf & _
    '              companyAddress.Text & vbCrLf & _
    '              companyZip.Text & " " & companyTown.Text & vbCrLf & vbCrLf & _
    '              "Kontaktperson:" & vbCrLf & _
    '              companyContact.Text & vbCrLf & _
    '              "Tlf. " & companyPhone.Text & vbCrLf & _
    '              companyEmail.Text & vbCrLf & vbCrLf & _
    '              "Kommentar:" & vbCrLf & _
    '              companyComment.Text()

    'SmtpMail.SmtpServer = "vip.cybercity.dk"
    'SmtpMail.Send(AdminMail)

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

...og så skal den både sende en mail, og smide data ind i databasen "bookingCalendar" med felterne:

BookingId
staffId (vælges fra gridViewet "availableStaffGrid")
functionId (vælges fra selectboxen "functionSelector")
date (vælges fra kalender modulet "calendar")
costumerName
costumerAddress
costumerZip
costumerTown
costumerContact
costumerPhone
costumerEmail
costumerComment
status (sættes til false, feltet er et "bit" felt, så værdien skal bare være [0]. Det skal bruges til at sættes staus til at være "GODKENDT" el. "IKKE GODKENDT" af administratoren )
Avatar billede neoman Novice
13. maj 2007 - 13:09 #3
hehe - nu vil jeg sku ikke løse HELE opgaven for dig:-) ...

mht gemme data:
Jamen det gør den jo af sig selv når brugeren trykker på Insert og din DataSourceID="InsertData" har en update metode defineret - har den det ? (og din "costumer" er en "customer" ?? :-)

vender li tilbage mht til aflæsning af felterne
Avatar billede neoman Novice
13. maj 2007 - 13:40 #4
Ok - du kan jo sende din email når opdateringen af DB'en er gået godt. Dvs du skal lave en handler for ItemInserted eventet og det kan du gøre sådan her
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref16/html/P_System_Web_UI_WebControls_DetailsViewInsertedEventArgs_Values.htm

i eksemplet bemærk linjen
Dim name As String = e.Values("CompanyName").ToString()

for her kan du tilføje de andre felter og få fat i deres værdi for at sende med din mail-routine.

Hvis der er noget som er sort snak så spørg:-)
Avatar billede neoman Novice
13. maj 2007 - 13:53 #5
hehe - nok bedre med et link  som er tilgængeligt via nettet :
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsviewinsertedeventargs.values(vs.80).aspx
Avatar billede torpmikkelsen Juniormester
13. maj 2007 - 14:29 #6
Du skriver at den skal have en update metode. Er det ikke et INSERT statement jeg skal bruge, når jeg bygger mit query?
Avatar billede neoman Novice
13. maj 2007 - 14:34 #7
Jo - men en datasoure's "UPDATE" metode dækker over alt andet end SELECT - dvs. insert/delete/update

Hvad er din datasource ? SqlDataSource ? Du kan jo bede den om automatisk at lave insert/dele/update  statements når du definerer din select - og hvis du ikke har joins mellem den /de tabeller som der selectes fra, så plejer den selv at finde ud af at lave disse statements
Avatar billede neoman Novice
13. maj 2007 - 14:38 #8
og ellers, så skal du have fat i ItemInserting eventet for din detailsview, og derinde selv køre en INSERT statement på dine data
Avatar billede neoman Novice
13. maj 2007 - 14:44 #9
Nu kigger jeg lidt nærmere på hvad du ønsker at gemme - der er et eller andet galt her :

...og så skal den både sende en mail, og smide data ind i databasen "bookingCalendar" med felterne:

BookingId
staffId (vælges fra gridViewet "availableStaffGrid")
functionId (vælges fra selectboxen "functionSelector")
date (vælges fra kalender modulet "calendar")
costumerName
costumerAddress
costumerZip
costumerTown
costumerContact
costumerPhone
costumerEmail
costumerComment

I princippet bør din bookingCalendar indeholde CustomerID , og ikke kundens aktuelle data - men det er måske et bevidst valg ?
Avatar billede torpmikkelsen Juniormester
13. maj 2007 - 14:53 #10
Det er faktisk fordi man skal have mulighed for at booke, uden nøsvendigvis at have en bruger. Men hvis man har en bruger står brugerens data i felterne i forvejen, så man er fri for at indtaste dem hver gang.

Men der skal være mulighed for at booke uden bruger.

Hvis du har en ide til en anden opbygning er den meget velkommen.
Avatar billede neoman Novice
13. maj 2007 - 14:56 #11
Når du har en datasource, og den har select/update/delete/insert statements, så vil f.eks. en detailsview automatisk  benytte sig af disse statements så det er nemt at opdatere data i db'en.

hvis din datasource IKKE har f.eks. en insert statement defineret, så skal man selv fortælle detailsview'et havd den skal gøre , når den skal opdatere db'en.

Det gør man ved selv at åbne en forbindelse, inserte npget i db'en og lukke igen. Dettte foretages fra det event for dataview'et som fyres af, når brugeren trykker på insert. Det er netop det der sker i ItemInserting - så det er derinde at din INSERT skal udføres. Hvis der er noget som er uklart - spørg.
Avatar billede torpmikkelsen Juniormester
13. maj 2007 - 16:21 #12
Nu har jeg fået koblet mit detailsView sammen med databasen, så jeg kan indsætte nye bookinger. Men feltet "date" skal den jo hente fra kalenderen, og på samme måde skal "staffId" hente fra "availableStaffGrid" og "funtionId" fra "functionSelector"

Hvordan får jeg den til at hente noget, som er defineret tidligere i koden, istedet for at lave et indput felt til at skrive i?

Jeg håber du forstår...
Avatar billede neoman Novice
13. maj 2007 - 16:47 #13
hvordan er din detailsview koblet sammen med db'en ? Igen hvis du har en datasource, under definitionen for din SELECT kan du vælge felter som skal hente sin værdi et andet sted (kig under WHERE knappen ) - f.eks. en kontrol på siden , querystring, whatever. Vis hvordan du får data ind i din detailsview
Avatar billede torpmikkelsen Juniormester
13. maj 2007 - 16:51 #14
Jeg har bare et objectDataSource som selecter alle felter i tabellen bookingCalendar, og den har jeg koblet sammen med mit detailsview.
Avatar billede neoman Novice
13. maj 2007 - 17:02 #15
argh - det var ikke helt gennemtænkt ..

på en eller anden event på din detailsview skal du hente værdierne fra de andre kon troller - nu er det lidt uklart for mig hvad type af kontrol de andre værdier sidder i - men for eksemepel:
du har en dropdownlist som hedder ddlNogetAtVælge

så er den valgte værdi gemt i ddlNogetAtVælge.SelectedValue

og i din detialsview skal du tage den række hvortil værdien passer
Detailsview1.Detailsviewrow(2).Cells(1) (hvis det er i række nummer 3 og i celle 2)
og sige
minDetailsView.Detailsviewrow(2).Cells(1) = ddlNogetAtVælge.SelectedValue

så alt i alt :
            Dim row As DetailsViewRow = minDetailsView.Rows(2)

            row.Cells(1).Text=ddlNogetAtVælge.SelectedValue

og tilsvarende for de andre rækker i din detailsview.

Disse assigments skal så køres på passende tidspunkt (pageload) ? samt hver gang en værdi ændres i f.eks. ddlNogetAtVælge (og det kan så køres i dens SelectedIndexChanged event
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 19:48 #16
Har du lavet en metode til din objectdatasource som indsætter værdier for dig ?
Hvis du gør det kan du afsende mailen derfra.
Avatar billede torpmikkelsen Juniormester
14. maj 2007 - 09:43 #17
Hej dr_chaos - velkommen til :o)

Jeg blev simpelthen nød til at stoppe igår, efter at have siddet hele dagen uden at få noget til at virke.

Når jeg læste neomans indlæg var det eneste jeg så : hodshd =js shsh hs @khsh sæahdnænnhsjgdsg  jsdh  = lhsdlanpah

Jeg kunne ikke få noget som helst ud af det. Så nu har jeg sovet på det, og nu gir' det pludselig mening og jeg kan se hvad der står. Så det er fantastisk.

Jeg har lige lavet en lille demo af det jeg skal bruge, og det ser ud til at fungere. Så nu skal jeg bare lige have det helt op at køre... men der kommer sikkert flere udfordringer.
Avatar billede torpmikkelsen Juniormester
14. maj 2007 - 10:31 #18
Nu er den der vist næsten. Men der er et eller andet galt!

Jeg kan godt få den til at putte værdierne ind i felterne, men den melder en fejl i skriptet når jeg trykker på indsæt.

Den skriver:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Hvis jeg skriver datoen manuelt - fx. 15-05-2007 - så virker det fint.
Avatar billede neoman Novice
14. maj 2007 - 11:05 #19
LOOL - jeg har siddet og bakset med MSSQL og datoer HEEEEEEELE natten.

1. Hvis du tillader NULLS i din datokolonne i DB'en og prøver at oprette en record med NULL (f.eks. som default) for datoen så får du netop denne fejl, da SQL har en mindre range på datoer end .NET, og .NET's null falder udenfor hvad SQL opfatter som gyldigt.

2. Ellers er der vel gået den sædvanlige ged i datokonverteringer til det amerikanske formati db'en (hvor den per defautl har datoer i formatet mm/dd/yyyy, i stedet for vore danske dd/mm/yyyy. 

Hvis du har en kontrol med datoer for eksempel textbox txtMinDato, så gør jeg dette her

cdate(txtMinDato.text).tostring

og således, når du har et felt - mitDatoFelt -  i din record som skal have en dato,


mitdatofelt=
cdate(txtMinDato.text).tostring

netop DET problem hele natten !! :-)
Avatar billede torpmikkelsen Juniormester
14. maj 2007 - 12:24 #20
Jeg tror at jeg har fået den til at gøre det som du mener. Se lige linket her: http://torpmedia.dk/exp/interface.gif

Den laver datoen om fra "23-05-2007" til "23-05-2007 00:00:00"

Det er vel det den skal, ik?

Men den melder stadig fejlen: http://torpmedia.dk/exp/error.gif
Avatar billede neoman Novice
14. maj 2007 - 12:36 #21
Jeg var lidt for hurtig - for den "kur" er noget som kurerer andre skavanker i mit eget program  selv nemlig..

CDate konverterer den dato man selv har tastet, i hht. den culture setting du nu har, til den interne format (mm-dd-yyyy) som så direkte kan gemmes i Db'en, mens .ToString koverterer jo tilbage til en text(igen efter den culture setting man nu engang har)

Ergo:

Du skal enten gemme datoen som cdate(txtMinDato.text)
eller som cdate(txtMinDato.text).ToString("mm-dd-yyyy")

Beklager forvirringen - men dette er noget jeg selv lige netop  har steppet igennem sååh -)
Avatar billede neoman Novice
14. maj 2007 - 12:38 #22
aargh .. "MM-dd-yyyy" skulle der have stået ..... er vist for søvning efter nattens udskejelser :-(
Avatar billede dr_chaos Nybegynder
14. maj 2007 - 20:19 #23
hvordan ser din update metode ud ?
Avatar billede torpmikkelsen Juniormester
15. maj 2007 - 08:25 #24
Updatemetoden er bare den indbyggede. Den selecter via et objectDataSource, og så har jeg sat flueben ved "Enable Inserting"
Avatar billede torpmikkelsen Juniormester
15. maj 2007 - 10:28 #25
Jeg har en selectbox hvor jeg vælger en value, som så bliver placeret i første felt i inputformen. Det ser umiddelbart rigtigt ud. Men når jeg så fyrer skriptet afsted, bliver valuen bare "0" i databasen...

Hvad pokker gør jeg forkert.

Jeg har denne event på selector modulet:
insertForm.Rows(1).Cells(1).Text = selector.SelectedValue
Avatar billede torpmikkelsen Juniormester
15. maj 2007 - 10:51 #26
Hvis i kigger på mit screenshoot...
http://torpmedia.dk/exp/interface.gif

...så kan i se at den insætter værdierne i felterne, men ikke i deciderede tekstbokse. Er det sådan det skal være, eller er det der fejlen sådan set sker?
Avatar billede neoman Novice
15. maj 2007 - 11:31 #27
du gør ikke noget forkert - det er mig som har ledt dig på afveje :-)
insertForm.Rows(1).Cells(1).Text er tydeligvis en label når din insertForm er i normal display mode (eller hvad den nu hedder).

Når din insertForm er i Insert mode, så er der tydeligvis en textbox control i cellen som skal gives værdien - når du sætter cell(1).text = "et eller andet" så udraderer du textboxen, og derfor får den Bind (som skal flytte data fra textboxen til det felt i datasettet som feltet er bundet til, ikke noget at spise :-(

prøv med dette her :

dim myTextBox as textbox
myTextBox.rows(1).cells(1).controls(0) ' dette burde finde den første kontrol i cellen
myTextBox=selector.selectedValue

Jeg er først tilbage senere - dette her "off the cuff"  så jeg håber det virker :)
Avatar billede neoman Novice
15. maj 2007 - 11:32 #28
om igen :
dim myTextBox as textbox = myTextBox.rows(1).cells(1).controls(0)

myTextBox=selector.selectedValue
Avatar billede neoman Novice
15. maj 2007 - 11:34 #29
jøsses - en gang til for kong Knud:

dim myTextBox as textbox= insertForm.rows(1).cells(1).controls(0)

myTextBox=selector.selectedValue
Avatar billede neoman Novice
15. maj 2007 - 11:35 #30
dim myTextBox as textbox= insertForm.rows(1).cells(1).controls(0)

myTextBox.text=selector.selectedValue

burde sove lidt  mere:-)
Avatar billede torpmikkelsen Juniormester
15. maj 2007 - 12:16 #31
Fedt - nu virker det!

Jeg tænkte nok at det var det der var galt ;o)

Så skal jeg bare havde den til at sende en mail. Men det håber jeg ikke bliver et problem.

Jeg vender lige tilbage - 1000 tak!
Avatar billede torpmikkelsen Juniormester
15. maj 2007 - 13:52 #32
Hvad nu hvis jeg ønsker at skjule de to felter, så brugeren ikke kan ændre i dem manuelt?

Hvis jeg bare sætter feltets visibility til false, så du det ikke længere.
Avatar billede torpmikkelsen Juniormester
15. maj 2007 - 13:58 #33
jeg mente... så duer det ikke længere
Avatar billede neoman Novice
15. maj 2007 - 14:10 #34
Skjule ? Hvis du IKKE ønsker at vise værdierne, så er værdierne væk fra insertForm, og så skal din ObjectDataSource ikke hente værdierne i insertForm men direkte ude på de kontroller hvor du sætter dem.

Hvis du ønsker at vise dem, men uden at brugeren kan ændre selv ved tastning, så kan du gøre to ting
A. disable kontrollen: f.eks. myTextBox.enabled=false
B. Bruge TemplateFields - i mark-up koden på aspx-siden kan man så, vidt jeg husker, sætte at et felt IKKE skal være editerbart. Hvis det ikke er rigtigt, så kan man i InsertTemplaten smide tekstboxen ud, og indsætte en label i stedet for - som brugeren jo ikke kan editere. At bruge Template Fields er ikke så svært - når du klikker på SmartTaggen for din insertForm  så er der en option et sted hvor du kan lave hvert felt om til templatefield - og så er det jo kun de "kriminelle felter" du skal ændre på den måde.
Avatar billede torpmikkelsen Juniormester
15. maj 2007 - 15:16 #35
OK - hvis jeg gerne vil have min ObjectDataSource til at hente værdierne direkte fra kontroller, hvordan skal mit statement så formuleres?
Avatar billede neoman Novice
15. maj 2007 - 18:22 #36
Kig her http://msdn2.microsoft.com/en-us/library/aa992069(vs.80).aspx

Det er jo ikke anderledes end med f.eks. en normal SqlDataSource, hvor du indsætter nogle parametre i select-statement, og derpå vælger hvor værdierne skal komme fra
Avatar billede torpmikkelsen Juniormester
04. juli 2007 - 22:27 #37
lukker
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



IT-JOB