Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ajax - DataGrid TemplateColumn - Session

[es] :: .NET :: Ajax - DataGrid TemplateColumn - Session

[ Pregleda: 2140 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ads

Član broj: 127796
Poruke: 13
*.dynamic.sbb.co.yu.



Profil

icon Ajax - DataGrid TemplateColumn - Session28.01.2007. u 10:48 - pre 210 meseci
Imam jedan cudan problem sa cuvanjem liste u session-u kada na strani imam updatepanel. Napravio sam malu aplikaciju da bih lakse objasnio ste me zeza. Potrebno mi je nesto nalik korpi u web prodavnicama. Nema logovanja usera, nema kolicne skroz je jednostavan primer i ceo mozete skinuti kao attach uz poruku.
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 {…}
}

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();
}

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;
}

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]
Prikačeni fajlovi
 
Odgovor na temu

ads

Član broj: 127796
Poruke: 13
*.BVCOM.NET.



Profil

icon Re: Ajax - DataGrid TemplateColumn - Session29.01.2007. u 14:03 - pre 209 meseci
Jooooooj ubi me ovo . Ajde mozda sam ja lose objasnio sta mi pravi problem, ali identicna stvar desava se i u Microsoft-ovom primeru koji ste verovatno svi skinuli kada i ajax. Znaci uz ASP.NET AJAX Sample Applications (http://go.microsoft.com/fwlink/?LinkID=77295) dolazi primer SimpleList i ako nekoga ne mrzi moze da proba ovo sto cu napisati.
Dakle, primer SimpleList (prosireni primer Scott's To Do List) ima tri stranice, a ovaj "da kazem bug" se vidi u 2_SimpleList_AutoComplete_DragandDrop.aspx. Ukoliko se ide na Tab All i stiklira neki item kao "completed", DataGrid tj u ovom slucaju GridView bez obzira sto mu je EnableViewState false, kao da pamti sta je stiklirano, a kasnije kada odes na neku drugu stranu i vratis back neocekivano poziva dogadjaj za cekiranje CheckBox-a, tacno onoliko puta koliko je i bilo cekiranih.
I sto je najgore kada se odradi operacija OnCheckedChanged u njoj ne mogu da razlikujem "ko je pozvao" tako da ona potpuno zezne logiku. joooooj
 
Odgovor na temu

ads

Član broj: 127796
Poruke: 13
*.bvcom.net.



Profil

icon Re: Ajax - DataGrid TemplateColumn - Session29.01.2007. u 15:58 - pre 209 meseci
Ako neko ima resenje neka kaze, za sada sam nabudzio ImageButton umesto CheckBox-a i on se ponasa kako treba, tj ne izaziva nikakve nepredvidive dogadjaje. Ako nekome ikada zatreba evo mog resenja u zip-u.
Prikačeni fajlovi
 
Odgovor na temu

[es] :: .NET :: Ajax - DataGrid TemplateColumn - Session

[ Pregleda: 2140 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.