Jag försöker göra en sökfunktion. Gessle, <code> Gessle, "När du klickar på sök så kör jag BindGrid. Problemet är nu när man sen klickar i Hmm, skrev lite otrydligt där. Jag har en ButtonColumn och när du klickar på den så hämtar den lite olika värde och "bygger" ihop en länk som den sen går till. Därför så måste ju sidan göra en postback innan den länkas vidare. Sätt EnableViewState=True i din DataGrid så ska bindningen ligga kvar. skumt, jag har enableViewState satt till true redan. ViewState är vad asp.net använder för att behålla formulärdata när man gör en postback. På en DataGrid är detta False som standard...har jag för mig...och man måste därför sätta den till True. Hos mig är enableviewstate satt till true som standard. 1. Om ditt DataGrid töms när du trycker på en länk eller knapp i griddet så görs det antingen ingen postback eller så har du inte viewstate true. i min page_load har jag Här har du felet. Jag har ingen dropdownlist men jag har i min Bind har jag Eftersom du har CommandName = "Select" på din ButtonColumn så skall ItemCommand utföras när du trycker på den. Okej, nu går den in i funktionen Grid1_ItemCommand :) Det du behöver göra är en FindControl för att hitta den valda gridradens knapp. Om det funkar så märker du det. Om det inte funkar så byt ut det mot FindControl. nej funkade inte, nu försvan griden igen så då måste jag nog köra en FindControl Nej jag får verkligen inte det att funka. Lägg till men jag har ju Gessle, Problemet kvarstår att när jag klickar på min buttoncolumn så ska den gå in i en funktion där den byggerihop en länk och sen går till den. Men eftersom att jag bygger upp min datagrid i codebehind så undrar jag om detta verkligen går att göra. Jag kanske är inne på fel spår men jag tror att följande fungerar: Gessle, Det verkar som om du lägger in hela tabellen i session. Kan inte detta bli problem om man har mycket data i sitt dataset? Gessle,Postback problem
Du fyller i lite textfält och använder dig av dropdownlist (som autopostar)
När du klickar på sök så kör jag BindGrid. Problemet är nu när man sen klickar i
datagriden för att tex gå till en länk så autopostas ju sidan och griden försvinner,
eftersom den bara binds på sökknappen.
Hur ska jag lösa detta?Sv: Postback problem
I din Page_Load kan du kolla Page.IsPostBack för att avgöra om du behöver binda om igen eller inte. Om du upptäcker att det är en post-back OCH att du har ett sökresultat tillgängligt, t.ex genom att det DataSet du binder till din Grid inte är null så kan du binda om det igen.. Lägg binding koden i en egen metod och anropa den från både din knapp och Page_Load (vid postback).
//Andreas
Sv: Postback problem
private void Page_Load(object sender, System.EventArgs e)
{
if(isPostback)
bindgrid();
}
</code>
så långt är jag med. Men i min bindgrid() så hämtar jag datasetet. Hur ska jag kunna kolla det i min Page_load, Det försvinner väl varje gång jag autopostar?Sv: Postback problem
Tja du kan juh lagra resultatet i antingen cachen eller i sessions objektet.
//AndreasSv: Postback problem
datagriden för att tex gå till en länk så autopostas ju sidan och griden försvinner,
eftersom den bara binds på sökknappen."
Om du klickar i din datagrid för att gå till en länk, byter du inte sida till den länken då? Annars kan du få förklara lite mer vad du har i ditt grid och vad som ska hända när du klickar på något.
Om sidan med griddet ska vara kvar när du klickar på något så lägger du en PostBack funktion på det du nu ska klicka på, använd ItemCommand. I den funktionen binder du griddet igen, precis som du gör på sök-knappen. Lägg bindningen i en egen funktion, som redan föreslagits, så kan du återanvända koden.
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Postback problem
Sv: Postback problem
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Postback problem
Ska den verkligen ligga kvar med det till true, fast jag autopostarSv: Postback problem
När du gör din PostBack så ska det ligga kvar. Om det inte gör det så har du något annat fel.
Hur ser din Page_Load event ut?
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Postback problem
just nu cachar jag datasetet för att i min postback kolla om det finns något dataset, i så fall så binder den med det datasetet.
som jag vill ha det är är det ju att jag binder datagriden varje gång jag trycker på sökknappen och sen har den samma dataset hela tiden tills att jag trycker på sök nästa gång, då den rensar datasetet och hämtar ett nytt.Sv: Postback problem
2. Hur ser din Page_Load ut? Page_Load körs först vid Post_Back och du kanske har något där som tömmer griddet.
3. Hur ser den funktion ut som du kör när du klickar på något i griddet?
Skicka in koden så kan vi felsöka.
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Postback problem
<code>
if(IsPostBack&&Cache.Get("ds")!=null)
bindgrid((DataSet)Cache.Get("ds"));
</code>
<code>
private void Grid1_SelectedIndexChanged(object sender, EventArgs e)
{
int ID = Convert.ToInt32(Grid1.DataKeys[Grid1.SelectedIndex]);
string link = "minsida.aspx?ID=" + ID;
Response.Write("<Script Language=JavaScript>self.location='" + link + "'</script>");
}
</code>Sv: Postback problem
Du ska inte binda din DataGrid igen i PostBack. Om du gör det så rensas din DataGrid och de val du gjort och gridden binder med ny data.
Ta bort de raderna som du visade ur din Page_Load och så binder du endast i din sök-knapp-funktion.
Det andra jag reagerar på är din Grid1_SelectedIndexChanged. Jag gissar på att du i varje rad i din DataGrid har en DropDownList. Men om du använder en av dem måste du som jag ser det göra en ItemCommand. Den funktionen håller reda på vilken Item i griddet du är på. Då kan du göra en FindControl för DropDownListan och få reda på vad du valt.
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Postback problem
<code>
ButtonColumn dgcol3 = new ButtonColumn();
dgcol3.CommandName = "Select";
dgcol3.Text = "<img src='images/blad.gif' border=0/>";
Grid1.Columns.Add(dgcol3);
</code>
När jag sen klickar på denna bilden så ska den ju göra detta
<code>
private void Grid1_SelectedIndexChanged(object sender, EventArgs e)
{
int ID = Convert.ToInt32(Grid1.DataKeys[Grid1.SelectedIndex]);
string link = "minsida.aspx?ID=" + ID;
Response.Write("<Script Language=JavaScript>self.location='" + link + "'</script>");
}
</code>
Men istället så försvinner bara min grid och inget mer händerSv: Postback problem
Har du tagit bort bindningen i Page_Load? Om inte, så prova det.
Lägg även till OnItemCommand="Grid1_ItemCommand" i din DataGrid och så skapar du en commandfunktion som skall utföra det som händer när knappen trycks.
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Postback problem
och så gör jag såhär i ItemCommand
<code>
if(e.CommandName=="Select")
{
int DocumentID = Convert.ToInt32(Grid1.DataKeys[e.Item.ItemIndex]);
</code>
Tack så jättemycketSv: Postback problem
Kolla den här artikelserien om DataGrid http://aspnet.4guysfromrolla.com/articles/040502-1.aspx
/pDSv: Postback problem
Själv så har jag aldrig använt Grid1.DataKeys[e.Item.ItemIndex]);
/pDSv: Postback problem
Ska jag söka upp ButtonColumn då eller?
(ButtonColumn)FindControl(" något ID kanske ");Sv: Postback problem
Här är hela min kod.
När jag klickar på sök så får jag upp datagriden precis som jag vill, med min ButtonColumn där det är en bil som jag vill kunna klicka på. När jag klickar på denna bilden så vill jag komma in i en funktion och ha med mig det UserID som är knutet till bilden.
Förstår inte hur jag ska lösa detta
<code>
private void Page_Load(object sender, System.EventArgs e)
{
}
private void Sok_Click(object sender, System.EventArgs e)
{
bind();
}
private void bind()
{
U um = new U();
DataGrid1.EnableViewState = true;
ButtonColumn dgcol3 = new ButtonColumn();
dgcol3.CommandName = "Select";
dgcol3.Text = "<img src='images/blad.gif' border=0/>";
DataGrid1.Columns.Add(dgcol3);
DataGrid1.DataKeyField = "UserID";
DataGrid1.ItemCommand +=new DataGridCommandEventHandler(DataGrid1_ItemCommand);
DataGrid1.DataSource = (DataSet)um.getAllUsers();
DataGrid1.DataBind();
}
</code>Sv: Postback problem
<code>
OnItemCommand="DataGrid1_ItemCommand"
</code>
i din DataGrid tagg.
Lägg sedan till en funktion
<code>
Sub DataGrid1_ItemCommand(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
' här kör du FindControl och sätter ihop din länk
End Sub
</code>
/pDSv: Postback problem
DataGrid1.ItemCommand +=new DataGridCommandEventHandler(DataGrid1_ItemCommand);
i min bind
men den går inte in i min DataGrid1_ItemCommand
Är du verkligen säker på att man inte behöver binda griden igen om man ska in i ItemCommand?Sv: Postback problem
Löste ditt problem sig eller behöver du mer hjälp? Om du är klar med detta problemet så markera inlägget som antingen löst (om du hittat en lösning - skriva gärna vad den var så andra kan ta del av både fråga och svar) eller stängd (om du inte hittat en lösning men problemet inte är aktuellt längre).
Om du inte löst problemet och vill ha mer hjälp så skriv ett inlägg som beskriver var du står idag med problemet (vad du har provat etc) så skall vi se om vi inte kan hitta en lösning.
//AndreasSv: Postback problem
ett försök att förtydliga.
Jag ska göra en sök sida.
1. Fyller i alla saker jag vill i mina textboxar, har här även några dropdownlistboxar som när man ändrar värde på autopostar sidan och några andra dropdownlistboxar ändras.
2. Du trycker sen på sök och jag binder min datagrid. Nu byggs griden upp i codebehind och jag lägger till en buttoncolum som när man klickar på ska ta med det ID som jag tilldelat den. Med hjälp av det så byggs en länk ihop och den går till den sidan.
Problem.
När man har fått upp sökresultatet och klickar på en button i min buttoncolum så går den inte in i funktionen. Anledningen är som jag ser det att sidan autopostas och eftersom griden inte binds i Page_Load så finns den inte kvar och då går den inte in i Item_Command eller vilken sorts event jag nu ska ha?.
Jag vill ju bara att griden ska bindas när jag klickar på sök. Och när jag ändrar värde i en dropdownlist så ska griden inte bindas igen men funktonen för dropdownlist_indexchanged ska ändå köras.
Fråga gärna om ni inte förstår något. Titta gärna längre upp där jag har med lite kod.Sv: Postback problem
Kör endast bind i Page_Load då sidan inte postas (IsPostback == false). Detta eftersom du använt ett javascript som laddar om sidan mha en querystring vilket resulterar i en GET och inte en POST.
Detta javascript verkar dock lite konstigt. Varför inte bara göra en response.redirect eller server.transfer om det du vill göra är att omdirigera användaren.
Att skicka vidare id-värdet kan annars göras på helt andra sätt, t.ex. genom att sätta det i en sessionsvariabel eller att använda ett dolt formulärfält.Sv: Postback problem
Lösningen på ditt problem är att skapa din ButtonColumn etc i <b>OnInit</b> istället för i <b>Page_Load</b> så kommer det att fungera. Problemet är att om kontrollerna inte finns när <b>Page_Load</b> exekveras så blir kan inte den relevanta <b>ViewState</b> informationen laddas in.
Här har du ett fullständigt exempel som visar hur du ska bygga upp det och om du provar den så kommer texten i den <b>Label</b> som ligger på sidan att ändras.
[HTML]
<%@ Page language="c#" Codebehind="GridForm.aspx.cs" AutoEventWireup="false" Inherits="Historik.GridForm" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>GridForm</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server"
AutoGenerateColumns="False"></asp:DataGrid>
<asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 8px; POSITION: absolute; TOP: 160px" runat="server">Label</asp:Label>
</form>
</body>
</HTML>
[CODE-BEHIND]
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Historik
{
/// <summary>
/// Summary description for GridForm.
/// </summary>
public class GridForm : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;
private DataTable contents = null;
private void Page_Load(object sender, System.EventArgs e)
{
this.CreateData();
if( !Page.IsPostBack )
{
this.BindGrid();
}
}
private void BindGrid()
{
DataGrid1.DataSource = this.contents;
DataGrid1.DataBind();
}
public void CreateData()
{
if (Session["Contents"] == null)
{
this.contents =
new DataTable();
contents.Columns.Add("Kolumn1");
contents.Columns.Add("Kolumn2");
contents.Columns.Add("Kolumn3");
contents.Rows.Add(new object[] {"http://","www.google",".com"});
contents.Rows.Add(new object[] {"http://","www.pellesoft",".se"});
contents.Rows.Add(new object[] {"http://","www.microsoft",".se"});
Session["Contents"] = this.contents;
}
else
{
this.contents =
(DataTable)Session["Contents"];
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
BoundColumn column1 = new BoundColumn();
column1.HeaderText = "Protocol";
column1.DataField = "Kolumn1";
DataGrid1.Columns.Add(column1);
BoundColumn column2 = new BoundColumn();
column2.HeaderText = "Name";
column2.DataField = "Kolumn2";
DataGrid1.Columns.Add(column2);
BoundColumn column3 = new BoundColumn();
column3.HeaderText = "Domain";
column3.DataField = "Kolumn3";
DataGrid1.Columns.Add(column3);
ButtonColumn column4 = new ButtonColumn();
column4.ButtonType = ButtonColumnType.LinkButton;
column4.Text = "Besök";
column4.CommandName = "Select";
DataGrid1.Columns.Add(column4);
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.DataGrid1.ItemCommand +=
new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_ItemCommand);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
Label1.Text = e.Item.Cells[0].Text + e.Item.Cells[1].Text + e.Item.Cells[2].Text;
}
}
}
Ursäkta att det blev så mycket kod men jag tänkte att ett fullt exempel skulle vara på sin plats då du kämpat länge med detta =)
//Andreas
Sv: Postback problem
Sv: Postback problem
För mindre mängder data är sessionsvariablerna användbara men om du skall hämta ut stora dataset så kanske du skall fundera på att lägga dem i cachen istället då det minnet kan enklare skötas av ASP.NET.
Caching Overview
http://www.dotnetjunkies.com/quickstart/aspplus/doc/cachingoverview.aspx
//Andreas