Toon posts:

[ASP.NET] Uitvoer volgorde

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een weblog systeem te maken in ASP.NET. Het is de bedoeling dat gebruikers van het 'pakket' doormiddel van webcontroles neer te zetten op de pagina makkelijk een weblog kunnen maken.

bijv.
code:
1
<yblog:RepeatEntries id="entries" runat="server"></yblog:RepeatEntries>

Dit stukje code geeft dan een lijst met log items terug die je kan weergeven (zoals een normale asp.net repeater). RepeatEntries heeft dus Repeater overgeërfd

Doordat je in deze control ook kan aangeven hoeveel logs je wilt weergeven wilde ik ook een navigatie control maken zodat je de volgende/vorige item kan laten zien.

Dus: << vorige && volgende >>
Daar had ik de volgende control voor gemaakt
code:
1
2
3
4
5
6
<yblog:entriesnavigator id="nav" runat="server" previoustext="Previous" nexttext="Next" entryrepeater="entries">
    <nametemplate>
        <b><%# Container.PreviousLink %></b>
        <b><%# Container.NextLink %></b>
    </nametemplate>
</yblog:entriesnavigator>

De property entryrepeater geeft het ID aan van de 'RepeatEntries' control. Doormiddel van dat ID kan ik de control opvragen en bepaalde properties opvragen. Dit werkt voor properties die al ingesteld zijn, dus in het control op de pagina. Waardes die ingesteld worden in de onload van RepeatEntries (zoals TotalRecords) kan ik niet opvragen.

Dit komt omdat de EntriesNavigator de functie DataBinder() override, Deze heb ik nodig om de child controls te creëren in de control. Deze DataBinder van de navigator wordt ten alle tijden eerder uitgevoerd dan de rest van de functies en classes.
code:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
    [ParseChildren(true)]
    public class EntriesNavigator : WebControl, INamingContainer
    {
        private string _previousText = "";
        private string _nextText = "";

        private string _entriesRepeater; 
        private ITemplate _nameTemplate;



        public string PreviousText
        { .. }

        public string NextText
        { ... }

        public string EntryRepeater
        { ... }
        
        
        [TemplateContainer(typeof(EntriesNavigatorTemplate))]
        public ITemplate NameTemplate
        {
            get { return _nameTemplate; }
            set { _nameTemplate = value; }
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad (e);            
        }

        public override void DataBind()
        {
            EnsureChildControls();
            base.DataBind ();
        }

        protected override void CreateChildControls()
        {
            Controls.Clear();
            EntriesNavigatorTemplate entryTemplate = new EntriesNavigatorTemplate();
            entryTemplate.PreviousText = _previousText;
            entryTemplate.NextText = _nextText;
            entryTemplate.ParentPage = base.Page;
            entryTemplate.createNextPrevPager((RepeatEntries)base.Page.FindControl(_entriesRepeater));

            _nameTemplate.InstantiateIn(entryTemplate);
            Controls.Add(entryTemplate);                
        }

    }


    public class EntriesNavigatorTemplate : WebControl, INamingContainer
    {
        private string _previousText = "";
        private string _nextText = "";

        private string _previousLink = "";
        private string _nextLink = "";

        private int _totalRecords = 0;
        private int _pagesize = 0;
        private int _currentpage = 0;

        private Page _parentPage;

        public string PreviousText
        { ... }

        public string NextText
        { .. }

        public string PreviousLink
        { ... }

        public string NextLink
        { ... }

        public Page ParentPage
        {
            get { return _parentPage; }
            set { _parentPage = value; }
        }


        public void createNextPrevPager(RepeatEntries _repeatEntries)
        {
    
            _totalRecords = _repeatEntries.TotalRecords;
            _pagesize = _repeatEntries.NumberOfLogs;
            _currentpage = _repeatEntries.PageIndex;
            
            if (_totalRecords > _pagesize && _currentpage < (_totalRecords / _pagesize))
                _nextLink = "<a href=\"" + getURL(_currentpage + 1) + "\">" + _nextText + "</a>";

            if (_currentpage > 0)
                _previousLink = "<a href=\"" + getURL(_currentpage - 1) + "\">" + _previousText + "</a>";
        }


        private string getURL(int newCurrentPage)
        { ... }

    }
Hoe kan ik voorkomen dat DataBind() eerder wordt aangeroepen dan de rest, want daardoor is totalRecords niet gevuld en kan ik de navigatie niet maken.