13. maj 2007 - 11:38Der 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.
...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 )
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" ?? :-)
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.
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
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.
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.
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?
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
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
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.
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, så
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 -)
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
...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?
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 :)
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.
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
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.