webForumDet fria alternativet

__doPostBack pekar på fel ctrl?

.NET

4 svar · 346 visningar · startad av CokeLight

Medlem sedan juni 2000504 inlägg
Frågan#1

Hejsan,

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:

javascript:__doPostBack('dgData:ctl13:_ctl14','')
javascript:__doPostBack('dgData:ctl13:_ctl15','')
javascript:__doPostBack('dgData:ctl13:_ctl16','')

osv.

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..?

Medlem sedan juni 20011 732 inlägg
#2

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.

Kod! :)

Medlem sedan juni 2000504 inlägg
#3

Hej NETwork,

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>
Medlem sedan juni 20011 732 inlägg
#4

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.

Medlem sedan juni 2000504 inlägg
#5

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
384 ms — deklarationer (db)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)
386 ms — ändringar (db)