[ASP.net]controlstate veranderen in repeater

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Wartodust
  • Registratie: Juli 2011
  • Laatst online: 03-10-2011
hallo,

ik heb een repeater die alle artikels krijgt uit een sql database met een ObjectDataSource genoemd dsGetArticles.Wat ik wil bereiken is wanneer iemand op een artikel klikt (adhv een < a href>) verander ik de datasource naar dsGetArticle en rebind() , dat werkt.

Nu als ik gechecked hebt of de gebruiker ingelogd is of niet, moet ik bepaalde functionaliteit toevoegen of verwijderen.Zolang ik mijn ObjectDataSource niet verander kan ik mijn Panel (s) .Visible op true of false zetten maar eens ik de DS verander lukt dat niet meer,hij gaat over zijn code maar de panels die ik op Visible = false zet, blijven zichtbaar....

hierbij een vb van mijn code:

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (!IsPostBack)
            {
                if (Request.QueryString["articleID"] != null)
                {
                    repArticles.DataSourceID = "dsGetArticle";
                }
                else
                {
                    repArticles.DataSourceID = "dsGetArticles";
                }
                repArticles.DataBind();
            }
            if (!User.Identity.IsAuthenticated)
            {
                foreach (RepeaterItem ri in repArticles.Items)
                {
                    Panel pnlArticleFunctions = ri.FindControl("pnlArticleFunctions") as Panel;
                    pnlArticleFunctions.Visible = false;
                }
            }


alle tips zijn welkom

groetjes,

Nick

[ Voor 0% gewijzigd door BtM909 op 04-07-2011 18:52 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:37

gorgi_19

Kruimeltjes zijn weer op :9

Eenvoudiger is het om via de querystring te werken, heb je ook niet het gezeur met geschift grote viewstates en gezeur met je controlcollection.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Wartodust
  • Registratie: Juli 2011
  • Laatst online: 03-10-2011
Is het mogelijk om daar een voorbeeld van te geven?

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-06 19:14
Gebruik het OnItemCreated event van de Repeater i.p.v. met de hand door de collectie RepeaterItems heen te lopen. Op het moment dat jij deze collectie opvraagt om er over heen te itereren kan het namelijk zo zijn dat deze nog helemaal niet gevuld is met de items behorende bij de nieuwe data binding. Je bent dan feitelijk bezig de zichtbaarheid van de oude items te veranderen, waarna de oude items weggegooid worden en vervangen door nieuwe, welke standaard weer zichtbaar zijn.

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
28
29
public void Page_Init()
{
  repArticles.ItemCreated += repArticles_ItemCreated;
};

public void Page_Load()
{
  if (!IsPostBack)
  {
    if (Request.QueryString["articleID"] != null)
    {
      repArticles.DataSourceID = "dsGetArticle";
    }
    else
    {
      repArticles.DataSourceID = "dsGetArticles";
    }
    repArticles.DataBind();
  }
}

private void repArticles_ItemCreated(Object sender, RepeaterItemEventArgs e)
{
  Panel pnlArticleFunctions = e.Item.FindControl("pnlArticleFunctions") as Panel;
  if (pnlArticleFunctions != null)
  {
    pnlArticleFunctions.Visible = User.Identity.IsAuthenticated;
  }
}



Verder is het veel slimmer om ViewState uit te schakelen en je Repeater op ongeacht welke request te rebinden met altijd de correcte data (die desgewenst uit een cache komt). Op de langere termijn zal dat je een heleboel van dit soort hoofdpijn besparen.

Acties:
  • 0 Henk 'm!

  • Wartodust
  • Registratie: Juli 2011
  • Laatst online: 03-10-2011
Bedank R4gnaxt ! Eindelijk een oplossing voor mijn probleem :)