Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[C#, ASP.NET AJAX]Update label meerdere malen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een webpagina met meerdere checkboxen, een label en een knop:
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:CheckBoxList ID="chkListTables" runat="server">
        <asp:ListItem>Bla1</asp:ListItem>
        <asp:ListItem>Bla2</asp:ListItem>
        <asp:ListItem>Bla3</asp:ListItem>
        <asp:ListItem>Bla4</asp:ListItem>
        <asp:ListItem>Bla5</asp:ListItem>
        <asp:ListItem>Bla6</asp:ListItem>
        <asp:ListItem>Bla7</asp:ListItem>
    </asp:CheckBoxList>
    <br />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:Button ID="btnFillTables" runat="server" Text="Vul tabellen" OnClick="btnFillTables_Click" />
            <br />
            <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
        <ProgressTemplate>
            <asp:Image ID="Image1" runat="server" ImageUrl="~/images/loading.gif" />
            <asp:Label ID="lblProgress" runat="server" Text="Bezig met verwerken . . . "></asp:Label>
        </ProgressTemplate>
    </asp:UpdateProgress>
    </form>


Als ik op de knop click wil ik wat gaan doen, afhankelijk van welke checkboxen geselecteerd zijn.
Per actie wil ik mijn label verversen zodat de gebruiker ziet hoe ver het proces is.
De label tekst wordt wel steeds vervangen, maar het wordt niet getoond om de pagina.
Hier is mijn button_click code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    protected void btnFillTables_Click(object sender, EventArgs e)
    {

        if (chkListTables.Items.Count == 0)
        {
            Label1.Text = "No tables selected";
        }

        for (int i = 0; i < chkListTables.Items.Count; i++)
        {
            if (chkListTables.Items[i].Selected)
            {
                // List the selected items
                Label1.Text += FillTables.FillTable(chkListTables.Items[i].Text);
            }
        }
    }


Wat er nu gebeurt is dat als alles klaar is de label op de pagina wordt ververst met bijv. de tekst:
code:
1
2
3
4
Filled Bla1 table.
Filled Bla2 table.
Filled Bla3 table.
Filled Bla4 table.


Terwijl ik dat per keer wil laten zien. Dus checkbox1 is klaar en de label wordt Filled Bla1 table., checkbox2 is klaar en de label wordt Filled Bla2 table., etc.

Wie stuurt mij de goede richting op?

BTW. Ik gebruik Vis. Web Developer 2008 Express

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 08:45

Haan

dotnetter

Je kan Invalidate() en Update() doen*, dan wordt je panel opnieuw getekend.

*zo werkt het in een Forms applicatie, misschien niet/anders in een web applicatie

[ Voor 37% gewijzigd door Haan op 21-08-2008 15:08 ]

Kater? Eerst water, de rest komt later


  • Sikkek
  • Registratie: Maart 2004
  • Laatst online: 16-11 14:11
Zo werkt dat niet in een ASP.Net applicatie. Je pagina wordt pas teruggestuurd als de code compleet doorlopen is, vandaar het gedrag.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16-11 21:54

TeeDee

CQB 241

Sikkek schreef op donderdag 21 augustus 2008 @ 16:02:
Zo werkt dat niet in een ASP.Net applicatie. Je pagina wordt pas teruggestuurd als de code compleet doorlopen is, vandaar het gedrag.
Ook met een Updatepanel, wat asynchrone meuk inhoudt?

TS:

Bouw eens een thread.sleep(n) in om te simuleren dat het een lange actie betreft?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
niet wat je zoekt maar misschien helpt het toch iets:

een update panel triggert een volledige postback, dus al je code gaat opnieuw af.

je kunt wel in de updatePanel_Load() methode afvangen of het een asynchrone postback is

ScriptManager.GetCurrent(this).IsInAsynchPostback

[ Voor 11% gewijzigd door 4of9 op 21-08-2008 18:04 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Verwijderd

Topicstarter
Ik had al een sleep ingebouwd, anders zie je nauwelijks verschil.
Ik snap deze suggestie niet echt:
je kunt wel in de updatePanel_Load() methode afvangen of het een asynchrone postback is
Als ik dat weet, wat dan? De voorbeelden die ik heb gevonden met IsInAsynchPostback gaan allemaal over de nieuwe history functionaliteit.

Ik kan me niet voorstellen dat dit niet mogelijk is. Ik zie af en toe websites waar ze soortgelijks doen. Ik kan die sites alleen niet meer vinden, dus weet ik niet of ze dat ook met AJAX/ASP.NET doen.

Ik heb ook nog gedacht aan de label (lblProgress) die in mijn UpdateProgress staat te gebruiken, maar die kan ik niet benaderen via code en daardoor niet aanpassen.

Als iemand anders nog een suggestie heeft dan hoor ik het graag.

  • Sh0ckTr00per
  • Registratie: Oktober 2003
  • Laatst online: 09:21
Ik heb iets vergelijkbaars gebouwd en daarbij de code die je in de button_click hebt staan in een thread gezet. Dan heb je een a-synchroon systeem wat je met een update panel en een timer kunt bijhouden.

Verwijderd

Topicstarter
ShockTr00per, bedankt voor je suggestie.
Ik ben nu bezig om the Threading toe te voegen, dat was ik sowieso al van plan ;)
Ik ben nog niet zo heel bekend met Threading en ik snap nog niet helemaal hoe nu met een timer de label is te vernieuwen.
Nu, met threading, is het resultaat nog hetzelfde. Pas aan het einde komt de label tekst op het scherm.
Dit is mijn FillTable methode, waarin ik de threading heb toegepast:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public string FillTable(string tablename)
    {
        try
        {

            switch (tablename)
            {
                case "msg_message":
                    ThreadPool.QueueUserWorkItem(new WaitCallback(FillMessageTable));
                    break;
                default:
                    Thread.Sleep(2000);
                    return "Filling " + tablename + " is not yet implemented.<br />";
            }
            return "Table " + tablename + " filled<br />";
        }
        catch (Exception ex)
        {

            return "Error in  FillTable, processing " + tablename + ":" + ex.ToString() + "<br />";
        }
    }

  • Sh0ckTr00per
  • Registratie: Oktober 2003
  • Laatst online: 09:21
Vanwege vakantie zie ik dit nu pas weer, maar omdat er verder nog niemand gereageerd heeft even mijn toevoeging.. Zo heb ik het opgelost, en dat werkt prima. Afhankelijk van het interval van je timer gaat die code vaak of niet zo vaak af. In de oplossing hier wordt er ook nog een grid gevuld met alles wat gedaan is omdat er soms meerdere per seconde gaan.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
protected void Button_Click(object sender, EventArgs e) {
    Thread objThread = new Thread(new ThreadStart(DoWhatever));
    Session["thread"] = objThread;  

    objThread.IsBackground = true;
    objThread.Start();
    timerUpdate.Enabled = true;
}

private void DoWhatever()
{        
    foreach (DataRowView drv in TableNames)
    {
        DoeIets(drv[0]);
        Session["done_last"] = drv[0];
    }
    timerUpdate.Enabled = false;
    Thread objThread = (Thread)Session["thread"];
    if (objThread != null && objThread.IsAlive)
        objThread.Abort();
}

protected void timerUpdate_Tick(object sender, EventArgs e)
{
     if (Session["done_last"] != null)
        lblTekst.Text = Session["done_last"].ToString();
}

[ Voor 4% gewijzigd door Sh0ckTr00per op 28-08-2008 10:52 ]

Pagina: 1