[ASP.NET C#] Treenode selectednode blijft 1e childnode

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hallo,

Ik heb sinds kort een vreemd hardnekkig probleem.

Ik heb een treeview die ik opbouw uit een gesorteerde table, deze gaat 5 nodes diep.
voorbeeldje

code:
1
2
3
4
5
6
7
8
9
A
|
|--B
|  |--C
|
|--D
|  |--E
|     |--F
G


Als ik A aanklik, geen probleem
Als ik B aanklik, geen probleem
Als ik C aanklik, geen probleem
Als ik D aanklik krijg ik B
Als ik E aanklik krijg ik C
Als ik F aanklik, geen probleem
Als ik G aanklik krijg ik A

Weet iemand wat er gaande is?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:29

mulder

ik spuug op het trottoir

Ik denk dat er iets fout gaat in de code. Maar zonder code is dat nogal een gok.

oogjes open, snaveltjes dicht


  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Ik kan functioneel al wel wat zien, blijkbaar pakt je code de eerste node die op een bepaalde diepte zit:

A & G zitten op niveau 0: je krijgt altijd A terug
B & D zitten op niveau 1: je krijgt altijd B terug
C & E zitten op niveau 2: je krijgt altijd C terug
F zit alleen op niveau 3: geen probleem

Feit blijft dat zonder code niets zinnigs te vertellen valt.

offtopic:
Maar je doet iets niet goed ;)

Eerst het probleem, dan de oplossing


Verwijderd

Topicstarter
ik heb alle code in de selectednodechanged event al eens weg gehaald alleen het probleem blijft zich voordoen.
hoe de treeview opgebouwd word is een ander verhaal

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
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
private void sortTree(DataSet ResultsList) {

        try {

            tvNavigation.Nodes.Clear();

            DataRow[] arrDataRow = ResultsList.Tables["Results"].Select("", "RKD_AN ASC, Cat1 ASC, Cat2 ASC, Cat3 ASC, Cat4 ASC, Cat5 ASC, Cat6 ASC, Taal ASC");

            int intArtist = 0;
            int intCat1 = 0;
            int intCat2 = 0;
            int intCat3 = 0;
            int intCat4 = 0;
            int intCat5 = 0;
            int intCat6 = 0;

            TreeNode tnArtist = new TreeNode();
            TreeNode tnCat1 = new TreeNode();
            TreeNode tnCat2 = new TreeNode();
            TreeNode tnCat3 = new TreeNode();
            TreeNode tnCat4 = new TreeNode();
            TreeNode tnCat5 = new TreeNode();
            TreeNode tnCat6 = new TreeNode();

            for (int i = 0; i < arrDataRow.Length; i++) {

                DataRow thisRow = arrDataRow[i];
                DataRow nextRow;

                if (i + 1 == arrDataRow.Length) {
                    nextRow = ResultsList.Tables["Results"].NewRow();
                    //nextRow["RKD_AN"] = "xxxx";
                    //nextRow["Cat1"] = "xxxx";
                    //nextRow["Cat2"] = "xxxx";
                    //nextRow["Cat3"] = "xxxx";
                    //nextRow["Cat4"] = "xxxx";
                    //nextRow["Cat5"] = "xxxx";
                    //nextRow["Cat6"] = "xxxx";
                    //nextRow["Taal"] = "xxxx";
                } else {
                    nextRow = arrDataRow[i + 1];
                }

                bool blnAddArtist = false;
                bool blnAddCat1 = false;
                bool blnAddCat2 = false;
                bool blnAddCat3 = false;
                bool blnAddCat4 = false;
                bool blnAddCat5 = false;
                bool blnAddCat6 = false;

                //nextrow
                //same? count
                //different? save!

                intArtist++;
                intCat1++;
                intCat2++;
                intCat3++;
                intCat4++;
                intCat5++;
                intCat6++;

                if (tnArtist.Text == "") {
                    tnArtist = new TreeNode(thisRow["RKD_AN"].ToString(), "RKD_AN");
                }
                if (tnCat1.Text == "") {
                    tnCat1 = new TreeNode(getCorrectString(thisRow["Cat1"].ToString()), "Cat1");
                }
                if (tnCat2.Text == "") {
                    tnCat2 = new TreeNode(getCorrectString(thisRow["Cat2"].ToString()), "Cat2");
                }
                if (tnCat3.Text == "") {
                    tnCat3 = new TreeNode(getCorrectString(thisRow["Cat3"].ToString()), "Cat3");
                }
                if (tnCat4.Text == "") {
                    tnCat4 = new TreeNode(getCorrectString(thisRow["Cat4"].ToString()), "Cat4");
                }
                if (tnCat5.Text == "") {
                    tnCat5 = new TreeNode(getCorrectString(thisRow["Cat5"].ToString()), "Cat5");
                }
                if (tnCat6.Text == "") {
                    tnCat6 = new TreeNode(getCorrectString(thisRow["Cat6"].ToString()), "Cat6");
                }

                if (nextRow["Cat1"].ToString() != thisRow["Cat1"].ToString()){
                    blnAddCat1 = true;
                }
                if (nextRow["Cat2"].ToString() != thisRow["Cat2"].ToString()) {
                    blnAddCat2 = true;
                }
                if (nextRow["Cat3"].ToString() != thisRow["Cat3"].ToString()) {
                    blnAddCat3 = true;
                }
                if (nextRow["Cat4"].ToString() != thisRow["Cat4"].ToString()) {
                    blnAddCat4 = true;
                }
                if (nextRow["Cat5"].ToString() != thisRow["Cat5"].ToString()) {
                    blnAddCat5 = true;
                }
                if (nextRow["Cat6"].ToString() != thisRow["Cat6"].ToString()) {
                    blnAddCat6 = true;
                }
                if (nextRow["RKD_AN"].ToString() != thisRow["RKD_AN"].ToString()){
                    blnAddArtist = true;
                }

                if (blnAddCat6 || blnAddArtist) {
                    blnAddCat6 = false;
                    if (tnCat6.Text != "") {
                        tnCat6.Text += " [" + intCat6.ToString() + "]";
                        tnCat5.ChildNodes.Add(tnCat6);
                    }
                    tnCat6 = new TreeNode();
                    intCat6 = 0;
                }
                if (blnAddCat5 || blnAddArtist) {
                    blnAddCat5 = false;
                    if (tnCat5.Text != "") {
                        tnCat5.Text += " [" + intCat5.ToString() + "]";
                        tnCat4.ChildNodes.Add(tnCat5);
                    }
                    tnCat5 = new TreeNode();
                    intCat5 = 0;
                }
                if (blnAddCat4 || blnAddArtist) {
                    blnAddCat4 = false;
                    if (tnCat4.Text != "") {
                        tnCat4.Text += " [" + intCat4.ToString() + "]";
                        tnCat3.ChildNodes.Add(tnCat4);
                    }
                    tnCat4 = new TreeNode();
                    intCat4 = 0;
                }
                if (blnAddCat3 || blnAddArtist) {
                    blnAddCat3 = false;
                    if (tnCat3.Text != "") {
                        tnCat3.Text += " [" + intCat3.ToString() + "]";
                        tnCat2.ChildNodes.Add(tnCat3);
                    }
                    tnCat3 = new TreeNode();
                    intCat3 = 0;
                }
                if (blnAddCat2 || blnAddArtist) {
                    blnAddCat2 = false;
                    if (tnCat2.Text != "") {
                        tnCat2.Text += " [" + intCat2.ToString() + "]";
                        tnCat1.ChildNodes.Add(tnCat2);
                    }
                    tnCat2 = new TreeNode();
                    intCat2 = 0;
                }
                if (blnAddCat1 || blnAddArtist) {
                    blnAddCat1 = false;
                    if (tnCat1.Text != "") {
                        tnCat1.Text += " [" + intCat1.ToString() + "]";
                        tnArtist.ChildNodes.Add(tnCat1);
                    }
                    tnCat1 = new TreeNode();
                    intCat1 = 0;
                }
                if (blnAddArtist) {
                    blnAddArtist = false;
                    if (tnArtist.Text == "") {
                        tnArtist.Text = this.GetLocalResourceObject("txtUnknownArtist").ToString();
                    }
                    tnArtist.Text += " [" + intArtist.ToString() + "]";
                    tvNavigation.Nodes.Add(tnArtist);
                    tnArtist = new TreeNode();
                    intArtist = 0;
                }
            }
        } catch (Exception ex) {
            lblException.Text = ex.Message;
            mvPages.ActiveViewIndex = 3;
            mvDetails.ActiveViewIndex = -1;
            //pnlMain.Update();
            pnlDetails.Update();
            return;
        }
    }


*edit*
Deze code doet vanaf een gesorteerde lijst alle duplicaten onder één node samenvoegen met een teller erachter.
getCorrectString() doet een string aan de hand van cultureinfo in de juiste taal teruggeven

was idd vergeten de opbouw te copy-pasten

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Durf niet eens te kijken naar de code...sorry (meer zeg ik niet)

Als je gaat debuggen, hoeveel (root) Nodes zitten er dan in de TreeView? Ik verwacht dat je er één vindt (namelijk A).

Eerst het probleem, dan de oplossing


Verwijderd

Topicstarter
lier schreef op woensdag 15 september 2010 @ 14:58:
Durf niet eens te kijken naar de code...sorry (meer zeg ik niet)

Als je gaat debuggen, hoeveel (root) Nodes zitten er dan in de TreeView? Ik verwacht dat je er één vindt (namelijk A).
ik zie dat de tvNavigation.Nodes.count op het aantal nodes staat wat er word weergeven, in het voorbeeldgeval is dit dus 2.

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Verwijderd schreef op woensdag 15 september 2010 @ 15:11:
ik zie dat de tvNavigation.Nodes.count op het aantal nodes staat wat er word weergeven, in het voorbeeldgeval is dit dus 2.
Tuurlijk, anders wordt deze ook niet in de TreeView getoond (stom !)

Kan je eens de code posten die het click event afhandelt ?

Het zou zoiets moeten zijn:
code:
1
private void tvNavigation_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e){}


Let wel op dat je de "e" moet gebruiken en niet de sender (omdat de TreeView de sender is) !

Eerst het probleem, dan de oplossing


Verwijderd

Topicstarter
de Click handel ik niet af, ik handel pas in de SelectedNodeChanged event, dit is de code die erin staat.
De code die ik gebruik heb ik ook al eens compleet weggehaald maar dit had ook geen effect.
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
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
protected void tvNavigation_SelectedNodeChanged(object sender, EventArgs e) {

        try {
            TreeView tn = (TreeView)sender;
            DataSet dsView = (DataSet)Session["Results"];
            DataView dvFilter = new DataView(dsView.Tables["Results"]);

            TreeNode tnSelected = tn.SelectedNode;
            TreeNode tnCurrent = tnSelected;
            TreeNode tnParent = tnCurrent.Parent;

            string strFilter = "";

            while (tnParent != null) {
                if (strFilter == "") {
                    strFilter += tnCurrent.Value + " LIKE '%" + tnCurrent.Text.Remove(tnCurrent.Text.LastIndexOf(' ')) + "%'";
                } else {
                    strFilter += " AND " + tnCurrent.Value + " LIKE '%" + tnCurrent.Text.Remove(tnCurrent.Text.LastIndexOf(' ')) + "%'";
                }
                tnCurrent = tnParent;
                tnParent = tnCurrent.Parent;
            }

            if (tnParent == null) {
                if (strFilter != "") {
                    if (tnCurrent.Text.StartsWith(this.GetLocalResourceObject("txtUnknownArtist").ToString())) {
                        dvFilter.RowFilter = "RKD_AN = ' '";
                        if (strFilter != "") {
                            strFilter = " AND " + strFilter;
                        }
                    } else {
                        dvFilter.RowFilter = "RKD_AN = '" + tnCurrent.Text.Remove(tnCurrent.Text.LastIndexOf(' ')) + "' AND " + strFilter;
                    }
                } else {
                    if (tnCurrent.Text.StartsWith(this.GetLocalResourceObject("txtUnknownArtist").ToString())) {
                        dvFilter.RowFilter = "RKD_AN = ' '";
                        if (strFilter != "") {
                            strFilter = " AND " + strFilter;
                        }
                    } else {
                        dvFilter.RowFilter = "RKD_AN = '" + tnCurrent.Text.Remove(tnCurrent.Text.LastIndexOf(' ')) + "'";
                    }
                }
            }

            Session["Filter"] = dvFilter.RowFilter;
            lblResultCount.Text = dvFilter.Count.ToString();
            lblTotalResults.Text = dvFilter.Count.ToString();
            grdResults.DataSource = dvFilter;
            grdResults.DataBind();
        } catch (Exception ex) {
            lblException.Text = ex.Message;
            mvPages.ActiveViewIndex = 3;
            mvDetails.ActiveViewIndex = -1;
            //pnlMain.Update();
            pnlDetails.Update();
            return;
        }
    }

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
anyone?

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Kan je eens debug output hier tonen van regel 8 waar je de SelectedNode uit leest?
Waarom declareer je een TreeView terwijl je er al direct bij kan (tvNavigation.SelectedNode volstaat toch)?
Zou je (bij wijze van test, je gekozen weg zou ook moeten werken) ook eens het NodeMouseClick event willen afhandelen ?

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Remote debuggen zal niet gaan aangezien op de betreffende server de componenten niet geïnstalleerd kunnen.
ik heb de treeview direct aangesproken nu en dat geeft bij de selectie ook steeds de eerste node van die laag aan
de NodeMouseClick event heb ik helaas niet aangezien ik in een webpagina werk en niet in een windows form

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tsja, probeer die methode van 181 regels eens te herschrijven in methodes die wel op een scherm passen en niet met copy-en-paste voor 6 verschillende categorieën aan elkaar hangen. Variabelen van 1-6 die over hetzelfde gaan kunnen bijvoorbeeld gewoon in een array. Dit is - met alle respect - een onleesbare verschrikking. :p

Verder moet je natuurlijk gewoon een omgeving hebben waarin je fatsoenlijk kan debuggen, dus stap-voor-stap.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

:o (teveel met WinForms gedaan...)

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik zal dan inderdaad even een debug omgeving moeten opzetten op die server. het was mijn laatste optie maar het is helaas niet anders.

Hoe ik variabelen 1-6 in een array kan pakken zou ik ook niet zo 1.2.3. kunnen bedenken, ik heb er al 2 dagen over gedaan om deze logica zo te krijgen.

ik heb een table met een hele hoop rijen deze zijn gesorteerd op Artiest en dan Cat1-6. Ik moet deze dus samenvoegen onder een treenode. Maar, er moet een teller bij komen EN er zijn lege velden aanwezig,

Mijn idee is om te bekijken of er een nieuwe waarde is en dan omgedraaid recursive de treenode op te bouwen tot de veranderde node. Zal misschien voor de wat ervarener programmeur gemakkelijk zijn, alleen met 1,5 jaar (pruts) ervaring ben ik helaas nog niet zo ver.

@lier
ach, maakt niet uit ik zat er laatst ook naast met winforms in een listbox een text en value willen proppen


*edit*
ik heb het probleem gevonden, alle values waren van alle nodes gelijk. hierdoor kwam dit probleem voor.
iig bedankt voor de aandacht en hulp!

bijv.
NodeA.Text = "123";
NodeA.Value = "Artist";
NodeB.Test = "456";
NodeB.Value = "Artist";

[ Voor 18% gewijzigd door Verwijderd op 17-09-2010 17:22 ]

Pagina: 1