Jag har problem med paging. Jag listar poster från db. Under dem står paging knapparna (1, 2, 3, 4 etc som man kan klicka på). Längst ner har jag en <asp:Panel>
Problemet är att när jag klickar på en paging knapp så visas inte nästa sida, utan min <asp:Panel> visas i browsern, oavsett vilken knapp jag trycker på.
Jag är inte säker på varför det blir så, men när man för musen över paging knapparna står det ju, t.ex:
Men det känns som att nåt fel har uppstått och att där det står ctl13 borde det egentligen stå ctl12... att den har hoppat över en ctl.. kan det stämma? Hur kan man påverka det? Kan jag ändra i koden så att den pekar på
javascript:__doPostBack('dgData:ctl12:_ctl14','')
Alltså att ctl13 är min <asp:Panel> och att det är därför det blir fel..? Eller så är jag ute o cyklar :)
Om ingen förstår kan jag koden men den e ganska lång..?
Nej, du kan inte påverka de javascript som kastas ut till klienten av asp.net... och den pekar knappast på fel kontroll, ctl12 bla blah är ju en identifierare på kontrollen i sig, inte en pekare på en annan kontroll.
tack för att du tar dig tid :) Här är koden. Jag är HELT clueless varför det blir som det blir.. gick det o förstå vad problemet var...? Jag tror att det går o köra copy/paste med koden o se hur det ser ut annars.. :)
<%@ Page Language="VB" SmartNavigation=true Debug="true"%>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.OleDb"%>
<script runat="server">
'declare connection
dim Conn as new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databassökväg")
sub Page_Load(obj as Object, e as EventArgs)
if Not Page.IsPostBack then
dgData.VirtualItemCount=500
FillDataGrid()
end if
end sub
sub Submit(obj as Object, e as EventArgs)
'insert new data
dim i, j as integer
dim params(7) as string
dim strText as string
dim blnGo as boolean = true
j = 0
for i = 0 to AddNewCustomerPanel.Controls.Count - 1
if AddNewCustomerPanel.Controls(i).GetType Is GetType(TextBox) then
strText = CType(AddNewCustomerPanel.Controls(i), TextBox).Text
if strText <> "" then
params(j) = strText
else
blnGo = false
lblMessage.Text = lblMessage.Text & _
"Du glömde ange ett värde för " & _
AddNewCustomerPanel.Controls(i).ID & "<p>"
lblMessage.Style("ForeColor") = "Red"
end if
j = j + 1
end if
next
if not blnGo then
exit sub
end if
dim strSQL as string = "INSERT INTO tblTourist " & _
"(sFname, sLname, sAddress, sZip, sCounty, sEmail, sPhone) VALUES (" & _
"'" & params(0) & "'," & _
"'" & params(1) & "'," & _
"'" & params(2) & "'," & _
"'" & params(3) & "'," & _
"'" & params(4) & "'," & _
"'" & params(5) & "'," & _
"'" & params(6) & "')"
'response.write("strSQL: " & strSQL)
'response.end
ExecuteStatement(strSQL)
FillDataGrid()
end sub
sub dgData_Edit(obj as object, e as DataGridCommandEventArgs)
FillDataGrid(e.Item.ItemIndex)
end sub
sub dgData_Delete(obj as object, e as DataGridCommandEventArgs)
dim strSQL as string = "DELETE FROM tblTourist " & _
"WHERE touristID = " & e.Item.ItemIndex + 1
ExecuteStatement(strSQL)
FillDataGrid()
end sub
sub dgData_Update(obj as object, e as DataGridCommandEventArgs)
if UpdateDataStore(e) then
FillDataGrid(-1)
end if
end sub
sub dgData_Cancel(obj as object, e as DataGridCommandEventArgs)
FillDataGrid(-1)
end sub
sub dgData_PageIndexChanged(obj as object, e as DataGridPageChangedEventArgs)
dgData.DataBind()
end sub
function UpdateDataStore(e as DataGridCommandEventArgs) as boolean
dim i, j as integer
dim params(7) as string
dim strText as string
dim blnGo as boolean = true
j = 0
for i = 1 to e.Item.Cells.Count - 3
strText = CType(e.Item.Cells(i).Controls(0), TextBox).Text
if strText <> "" then
params(j) = strText
j = j + 1
else
blnGo = false
lblMessage.Text = lblMessage.Text & _
"Du glömde att ange ett värde<p>"
end if
next
if not blnGo then
return false
exit function
end if
dim strSQL as string = "UPDATE tblTourist SET " & _
"sFname = '" & params(0) & "'," & _
"sLname = '" & params(1) & "'," & _
"sAddress = '" & params(2) & "'," & _
"sZip = '" & params(3) & "'," & _
"sCounty = '" & params(4) & "'," & _
"sEmail = '" & params(5) & "'," & _
"sPhone = '" & params(6) & "'" & _
" WHERE touristID = " & ctype(e.Item.Cells(0).Controls(1), Label).text
ExecuteStatement(strSQL)
return blnGo
end function
sub FillDataGrid(Optional EditIndex as integer=-1)
'open connection
dim objCmd as new OleDbCommand("select * from tblTourist where touristID < 100", conn)
dim objReader as OleDbDataReader
try
objCmd.Connection.Open()
objReader = objCmd.ExecuteReader()
catch ex as Exception
lblMessage.Text = "Fel vid databas anrop."
end try
dgData.DataSource = objReader
if not EditIndex.Equals(Nothing) then
dgData.EditItemIndex = EditIndex
end if
dgData.DataBind()
objReader.Close
objCmd.Connection.Close()
end sub
function ExecuteStatement(strSQL)
dim objCmd as new OleDbCommand(strSQL, Conn)
try
objCmd.Connection.Open()
objCmd.ExecuteNonQuery()
catch ex as Exception
lblMessage.Text = "Fel vid uppdatering av databas. ExecuteStatement()"
end try
objCmd.Connection.Close()
end function
</script>
<html><head>
<link rel="stylesheet" href="http://dario99/css/ie.css" type="text/css">
<asp:Literal id="Literal1" runat="server"></asp:Literal>
</head>
<body class="TextNormal">
<asp:Label id="lblMessage" runat="server"/>
<form runat="server">
<asp:DataGrid id="dgData" runat="server"
class="TextNormal"
HeaderStyle-BackColor="#6495ed"
FooterStyle-BackColor="#cccccc"
ItemStyle-BackColor="#f5f5f5"
AlternatingItemStyle-BackColor="#cccccc"
BorderColor="black" GridLines="Vertical"
cellpadding="4" cellspacing="0" width="100%"
AutoGenerateColumns="False"
OnDeleteCommand="dgData_Delete"
OnEditCommand="dgData_Edit"
OnCancelCommand="dgData_Cancel"
OnUpdateCommand="dgData_Update"
OnPageIndexChanged="dgData_PageIndexChanged"
AllowCustomPaging="true"
AllowPaging="true"
PageSize="9"
PagerStyle-Mode="NumericPages"
PagerStyle-PageButtonCount="25">
<Columns>
<asp:TemplateColumn HeaderText="ID">
<ItemTemplate>
<asp:Label id="Name" runat="server"
Text='<%# Container.DataItem("TouristID")%>'/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn HeaderText="Förnamn" DataField="sFname"/>
<asp:BoundColumn HeaderText="Efternamn" DataField="sLname"/>
<asp:BoundColumn HeaderText="Adress" DataField="sAddress"/>
<asp:BoundColumn HeaderText="Postnr" DataField="sZip"/>
<asp:BoundColumn HeaderText="Ort" DataField="sCounty"/>
<asp:BoundColumn HeaderText="E-post" DataField="sEmail"/>
<asp:BoundColumn HeaderText="Telefon" DataField="sPhone"/>
<asp:EditCommandColumn
EditText="Editera"
CancelText="Ångra"
UpdateText="Updatera"
HeaderText="Editera"/>
<asp:ButtonColumn HeaderText="Radera" text="Radera?" CommandName="delete" />
</Columns>
</asp:DataGrid><p>
<asp:Panel id="AddNewCustomerPanel" runat="server">
<table class="TextNormal">
<tr>
<td width="100" valign="top">
För och efternamn:
</td>
<td width="300" valign="top">
<asp:TextBox id="tbFName" runat="server" class="TextNormal"/>
<asp:TextBox id="tbLName" runat="server" class="TextNormal"/>
</td>
</tr>
<tr>
<td valign="top">
Adress:
</td>
<td valign="top">
<asp:TextBox id="tbAddress" runat="server" class="TextNormal"/>
</td>
</tr>
<tr>
<td valign="top">
Postnr och ort:
</td>
<td valign="top">
<asp:TextBox id="tbZip" runat="server" class="TextNormal"/>
<asp:TextBox id="tbCounty" runat="server" class="TextNormal"/>
</td>
</tr>
<tr>
<td valign="top">
E-post:
</td>
<td valign="top" colspan="2">
<asp:TextBox id="tbEmail" runat="server" class="TextNormal"/>
</td>
</tr>
<tr>
<td valign="top">
Telefon:
</td>
<td valign="top" colspan="2">
<asp:TextBox id="tbPhone" runat="server" class="TextNormal"/>
</td>
</tr>
<tr>
<td valign="top" colspan="3">
<asp:Button id="btnSubmit" runat="server" text="Lägg till" OnClick="Submit" class="TextNormal"/>
</td>
</tr>
</table>
</asp:Panel>
</form>
</body>
</html>
Hua, nu är jag inte duktig på vb (vart har alla goa c#-gubbar tagit vägen!? :)) men det räcker inte med att bara binda om sidan när du kör en pagechange event, du måste hantera händelsen också:
sub dgData_PageIndexChanged(obj as object, e as DataGridPageChangedEventArgs)
dgData.CurrentPageIndex = e.NewPageIndex
//...och sen får du databinda din datagrid igen
end sub
Att din panel visas hela tiden, även efter en roundtrip, är ju inte så konstigt eftersom du aldrig döljer den? Eller så missuppfattade jag vad du menade.
Hejsan ! okay, jag provade, men det vart fortfarande fel.. hmm.. jo, det låter ju rimligt att man måste göra det som du sa utöver att bara binda datat..
Okay, jag kan försöka beskriva problemet igen, genom att beskriva vad som händer och hur sidan ser ut rent designmässigt:
- Först på sidan har jag en listat min tabell på sidan. Den är f.n. nio rader (enl datagridens anvisningar).
- Under tabellen är alla paging knapparna uppradade, 25 st.
- Längst ner på sidan har jag min <asp:Panel> med en grupp textboxar där man fyller i namn o adress osv.
Problemet:
När man klickar på en paging knapp så hoppas man ju att nio nya poster i tabellen ska listas. Men när sidan har laddats klart är allt man ser i browsern den här <asp:Panel>. Klickar jag refresh i browsern så återställs sidan som den var innan.
Kommentar:
Paging funktionen fungerar bra för sig.
Edit/Radera funktionerna fungerar bra för sig.
Men det är när de ligger tillsammans som det här felet uppstår. (Skulle va kanon om nån hittade felet för det är så trist när man som nybörjare kör fast innan man ens kommit nånstans :) )
531 ms totalt · 4 externa anrop · v20260731065814-full.868a69e5