Osnovna klasa mi je Artikal. U skracenom obliku izgleda ovako:
Code:
public class Artikal
{
public Artikal()
{
}
private int id;
private string naziv;
private bool uKorpi;
public int Id {…}
public string Naziv {…}
public bool UKorpi {…}
}
public class Artikal
{
public Artikal()
{
}
private int id;
private string naziv;
private bool uKorpi;
public int Id {…}
public string Naziv {…}
public bool UKorpi {…}
}
Prvo u Global.asax inicijalizujem Session u kome cu cuvati id-eve artikala
Code:
void Session_Start(object sender, EventArgs e)
{
Session["Korpa"] = new ArrayList();
}
void Session_Start(object sender, EventArgs e)
{
Session["Korpa"] = new ArrayList();
}
Na strani za pretragu imam jedno dugme i DataGrid za prikaz rezultata, ali sa cekiranim chkUKorpi ukoliko je artikal vec dodat u session. To izgleda ovako:
Code:
protected void btnTrazi_Click(object sender, EventArgs e)
{
this.dgPretraga.DataSource = this.TraziArtikle();
this.dgPretraga.DataBind();
}
private List<Artikal> TraziArtikle()
{
List<Artikal> artikli = new List<Artikal>();
Artikal art;
art = new Artikal();
art.Id = 1;
art.Naziv = "Tastatura";
artikli.Add(art);
art = new Artikal();
art.Id = 2;
art.Naziv = "Mis";
artikli.Add(art);
art = new Artikal();
art.Id = 3;
art.Naziv = "Monitor";
artikli.Add(art);
//provera da li je artikal vec u korpi
ArrayList korpa = (ArrayList)Session["Korpa"];
foreach (int id in korpa)
{
foreach (Artikal a in artikli)
{
if (a.Id == id)
a.UKorpi = true;
}
}
return artikli;
}
...
<asp:datagrid id="dgPretraga" runat="server" autogeneratecolumns="False"
datakeyfield="Id" ShowHeader="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:CheckBox ID="chkUKorpi" runat="server"
Checked='<%# DataBinder.Eval(Container.DataItem, "uKorpi")%>'
AutoPostBack="True" OnCheckedChanged="chkUKorpi_OnCheckedChanged" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "Naziv")%>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
...
protected void chkUKorpi_OnCheckedChanged(object sender, EventArgs e)
{
int ind = ((DataGridItem)((CheckBox)sender).NamingContainer).ItemIndex;
int id = ((int)this.dgPretraga.DataKeys[ind]);
ArrayList korpa = (ArrayList)Session["Korpa"];
if (((CheckBox)sender).Checked == true)
{
korpa.Add(id);
}
else
{
korpa.Remove(id);
}
Session["Korpa"] = korpa;
}
protected void btnTrazi_Click(object sender, EventArgs e)
{
this.dgPretraga.DataSource = this.TraziArtikle();
this.dgPretraga.DataBind();
}
private List<Artikal> TraziArtikle()
{
List<Artikal> artikli = new List<Artikal>();
Artikal art;
art = new Artikal();
art.Id = 1;
art.Naziv = "Tastatura";
artikli.Add(art);
art = new Artikal();
art.Id = 2;
art.Naziv = "Mis";
artikli.Add(art);
art = new Artikal();
art.Id = 3;
art.Naziv = "Monitor";
artikli.Add(art);
//provera da li je artikal vec u korpi
ArrayList korpa = (ArrayList)Session["Korpa"];
foreach (int id in korpa)
{
foreach (Artikal a in artikli)
{
if (a.Id == id)
a.UKorpi = true;
}
}
return artikli;
}
...
<asp:datagrid id="dgPretraga" runat="server" autogeneratecolumns="False"
datakeyfield="Id" ShowHeader="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:CheckBox ID="chkUKorpi" runat="server"
Checked='<%# DataBinder.Eval(Container.DataItem, "uKorpi")%>'
AutoPostBack="True" OnCheckedChanged="chkUKorpi_OnCheckedChanged" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "Naziv")%>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
...
protected void chkUKorpi_OnCheckedChanged(object sender, EventArgs e)
{
int ind = ((DataGridItem)((CheckBox)sender).NamingContainer).ItemIndex;
int id = ((int)this.dgPretraga.DataKeys[ind]);
ArrayList korpa = (ArrayList)Session["Korpa"];
if (((CheckBox)sender).Checked == true)
{
korpa.Add(id);
}
else
{
korpa.Remove(id);
}
Session["Korpa"] = korpa;
}
I sad glavni problem je u CheckBox-u kojim se neki artikal dodaje u korpu. Na pocetku sve lepo radi i smesta artikle u session, zatim idem na stranicu koja prikazuje sta je u korpi, ali sa pravim PostBack-om. Kada se vratim na dugme Back pa opet radim pretragu ponovo mi se, ali ovog puta potpuno neocekivano, poziva dogadjaj OnCheckedChanged koji sve pokvari :(. Zezam se vec dva dana sa ovim i ne mogu da resim. Napominjem jos jednom da ukoliko zakomentarisete updatepane i trigger sve radi super.
Ukoliko vam je nezgodno da se snadjete u postu stavio sam attach, programcic je jako prost.
Molim za pomoc.
[Ovu poruku je menjao ads dana 29.01.2007. u 13:08 GMT+1]