Avatar billede bodil_bruun Nybegynder
27. august 2002 - 12:13 Der er 16 kommentarer og
1 løsning

form + rens + opdater

Hej
Jeg har noget asp.net kode, der viser indhold af database.
Ved indtastning i en form bliver nyt indhold gemt i databasen og vist.

Jeg har dog to problemer, måske mest fordi jeg ikke helt forstår asp.net:
1) Hvordan renser jeg formen, så nye data kan indtastes ?
2) Hvis man klikker på opdater, så sendes form-indhold igen og kommer til at ligge i databasen to gange. Hvordan undgår jeg det ?
bodil
Avatar billede z42cool Nybegynder
27. august 2002 - 12:35 #1
Du bliver nok nødt til at vise os noget kode, men umiddelbart kan du på serversiden rense indholdet af formen ved at sætte de korrekte proerties på server kontrollerne. Er det f.eks. en textbox sættes .Text="". Så længe din opdater knap er wired til en event handler der indsætter formens data i en database, så vil det ske hver gang der trykkes på opdater, men en mulighed er at sætte opdater knappen til en anden event handler når dine data er indsat!
Avatar billede bodil_bruun Nybegynder
27. august 2002 - 13:17 #2
Her er lidt kode fra aspx og aspx.vb filerne:

<%@ Page Language="vb" AutoEventWireup="false" codebehind="nr2.aspx.vb" Inherits="WebApplication1.nr2" %>
...........
<td vAlign="top"><asp:datagrid id="dgNameList1" runat="server"></asp:datagrid></td>
<form runat="server" ID="Form2">
  <asp:Label id="Label1" runat="server">ID</asp:Label>
  <asp:TextBox id="fvvId" text="" runat="server" ></asp:TextBox><br>
  <asp:Label id="Label2" runat="server">Name</asp:Label>
  <asp:TextBox id="Name" text="" runat="server"></asp:TextBox><br>
  <asp:Button ID="knap1" Text="Indsæt post" OnClick="opdate" Runat="server" />
  <asp:Button id="Button1" runat="server" Text="Reset"></asp:Button>
</form>

.........
Public Class nr2
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Viser dataindhold fra start
        ............
  End Sub
    Sub opdate(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ' -----------------------------------------------------------------
        ' add a new row to the table
        Dim objTable As DataTable
        Dim objNewRow As DataRow

        objTable = objDataSet.Tables("FVVtable")
        objNewRow = objTable.NewRow()
        objNewRow("id") = Request.Form("FVVid")
        objNewRow("name") = Request.Form("name")
        objTable.Rows.Add(objNewRow)

        ' =================================================================
        ' generate the update commands
        Dim objBuilder As SqlCommandBuilder

        objBuilder = New SqlCommandBuilder(objAdapter)

        ' =================================================================
        ' update the data store
        objAdapter.Update(objDataSet, "FVVtable")

        ' =================================================================
        ' refresh the data in the DataReader and bind it to a grid
        ' to prove that the data store has been updated

        strSQL = "SELECT * FROM FVVtable"
        objConnection.Open()
        Dim objCmd As New SqlCommand(strSQL, objConnection)
        dgNameList1.DataSource = objCmd.ExecuteReader(CommandBehavior.CloseConnection)
        dgNameList1.DataBind()
    End Sub
End Class
Avatar billede odegaard Nybegynder
27. august 2002 - 13:38 #3
Hvis data kommer til at optræde to gange, så opdaterer du jo ikke. Så må det jo være fordi du indsætter.
Avatar billede z42cool Nybegynder
27. august 2002 - 13:49 #4
For at nulstille din form kan du gøre som følger

<asp:Button id="Button1" runat="server" Text="Reset" OnClick="ResetForm"></asp:Button>

Sub ResetForm(ByVal sender As System.Object, ByVal e As System.EventArgs)
  fvvId.Text = ""
  name.Text = ""
End Sub

Jeg er ikke helt klar over præcist hvad du ønsker i forhold til flere form posts i følge af hinanden. Én mulighed er at frakoble knappen efter 1. form post, det er relativt simpelt, idet du blot kan disable knappen i din event handler ved at gøre følgende:
Avatar billede bodil_bruun Nybegynder
27. august 2002 - 13:50 #5
Du har ret - jeg indsætter data
Avatar billede z42cool Nybegynder
27. august 2002 - 13:50 #6
Ups..... Ramte forkert.... Nå men her er fortsættelsen...

knap1.Enabled = False

En anden mulighed er at holde øje med om data allerede er indsat og hvis det er, så ændre det indsatte data i stedet for at indsætte det igen, dette er dog lidt sværere!
Avatar billede odegaard Nybegynder
27. august 2002 - 14:14 #7
Du må vel vide om du sidder og redigerer data der allerede eksisterer, eller om du beder om at oprette noget nyt?
Hvad med evt. at overveje instrukturering af måden hvorpå man vedligeholder data ?
Avatar billede bodil_bruun Nybegynder
27. august 2002 - 14:26 #8
Jeg indsætter data. Overskriften med opdatering henviser til at opdatere browseren- upræcist, men skrevet lige før madpakken blev åbnet. (Ville måske være ligeså upræcist formuleret efter spisning)
Andgående at overveje strukturering, så er alt bare så nyt og uoverskueligt. Jeg var glad for at det er lykkes at få kontakt med databasen og få vist data. Desuden virker det også med at indsætte data, men så dukkede problemerne op. - hvis man opdater browseren skriver den formens data ind i databasen igen , så posten gentages deri, og det er jo ikke smart.
Avatar billede odegaard Nybegynder
27. august 2002 - 14:40 #9
Kan du ikke blot lave en query for om data allerede findes? Hvis ikke skal det jo indsættes.
Så kan man selvfølgelig ikke indsætte den samme post to gange, hvis det virkelig er det man vil.

For mig at se, lyder det også som om fremgangsmåden ikke er gennemtænkt. Du skal ikke være bange for at lave meget om. Det bliver ALTID bedre! -og ikke mindst lærer du helt sikkert noget.
Avatar billede bodil_bruun Nybegynder
27. august 2002 - 14:56 #10
Databasen - som jeg ikke bestemmer over - kan indeholde ens poster. Det burde nok ikke være muligt, men sådan ser verden ud.
Mit problem er så, at brugeren vil (ved en fejltagelse) kunne komme til at sende sin indtastning ind to gange, ved at opdatere skærmen. Når man opdaterer skærmen sender man de data der står i formen. Hvis dataene er slettet med delete-tasten og ikke kan ses, bliver de alligevel (i min kode) sendt til databasen.
Jeg vil lave en kode hvor data godt kan gentages, men det skal være bevidst.
Avatar billede odegaard Nybegynder
27. august 2002 - 15:12 #11
Jeg kan godt se problemet... kan du evt. logge at denne side ikke dur mere, ved at gemme noget i en Session variabel? Jeg ved det ikke er kønt, men det burde man kunne.
Avatar billede bodil_bruun Nybegynder
27. august 2002 - 15:19 #12
I ovenstående inlæg burde jeg ikke ha' skrevet opdatere skærmen. Jeg mener: trykke på browserens opdater-knap.
Jeg har lavet en reset-knap som z42cool foreslår. Hvis jeg og vælger reset, så glemmes de indtastede data og man må trykke på opdater knappen så meget man lyster uden problemer. Det er fint.
Regnede med at hvis jeg bare kaldte "resetform"-proceduren fra "opdate"-proceduren, så ville data være glemt. Men det er de ikke. De kan ikke ses i formen, men sendes stadig til databasen ved tryk på opdater-knappen.
Avatar billede reffak Nybegynder
03. september 2002 - 01:05 #13
Hej
Et andet spørgsmål: Hvordan kan du have en server-control:

<asp:datagrid id="dgNameList1" runat="server"></asp:datagrid>

-liggende UDENFOR din <form runat="server">?

Siden det er en server-side control, ville jeg da mene den skulle ligge indenfor din server-side form...
andre> tager jeg fejl her?

MVH
Avatar billede reffak Nybegynder
03. september 2002 - 01:14 #14
Her er den absolut simpleste low-down and dirty løsning. Tilføj følgende linje nederst i sub opdate:

Response.Redirect("mypage.aspx")

Hvor mypage.aspx erstattes af din sides navn.

Dette gør at:
1. Form'en bliver slettet
2. At man ved tryk på refresh/opdater, ikke poster data igen

Dirty...men det virker

MVH
Avatar billede z42cool Nybegynder
03. september 2002 - 09:35 #15
reffak>> Så længe runat="server" skal .net runtimen nok behandle <asp datagrid/> taggen og rendere det korrekte html. Hvis den ligger udenfor <form/> taggen bliver kontrollens data dog ikke posted med tilbage og state for kontrollen fungerer derfor ikke, men det er givetvist ikke det store problem lige i dette scenarie!
Avatar billede reffak Nybegynder
03. september 2002 - 12:35 #16
z42cool>>ok, tak for opklaringen :-)
Avatar billede bodil_bruun Nybegynder
19. september 2002 - 11:51 #17
Det tog lidt tid at turde være dirty.
Men hellere bevidst dirty end bare småuvidende. Det sidste er jeg vant til så hvorfor ikke også dirty.
Tak for hjælpen.
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