[ASP.net / C#] Treeview uit database update niet

Pagina: 1
Acties:

  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
Oké mensen, ik begin hier een beetje door te draaien. Ik ben bezig met mijn eerste stappen in het .NET universum en zit nu hopeloos vast.

De situatie:
Ik heb een pagina met daarop een text-input, een submitbutton en een treeview. De treeview trekt de nodes uit de database (parent en child nodes), dat gaat prima. Ik heb gebruik gemaakt van deze informatie.

Het is de bedoeling dat wanneer er iets in het tekstveld wordt ingevuld en men op de submitbutton klikt, deze tekst ook aan de database wordt toegevoegd. Ook dat is niet zo ingewikkeld ;) Echter: de ingevoerde tekst wordt niet in de treeview getoond, tenzij de pagina met een harde refresh opnieuw geladen wordt.

Dit is de code van het form en de treeview:
HTML:
1
2
3
4
5
6
7
8
9
<form runat="server">
    <a href="#">Add a category</a><br />
    <asp:TextBox ID="strName" runat="server"></asp:TextBox><asp:Button ID="Button1" runat="server" Text="Save" onclick="geef_door" />
    <asp:TreeView ID="TreeView1" runat="server" ShowLines="True" ExpandDepth="2" OnTreeNodePopulate="TreeView1_TreeNodePopulate"  EnableTheming="True">
        <Nodes>
            <asp:TreeNode PopulateOnDemand="True" Text="Categories" Value="Categories"></asp:TreeNode>
        </Nodes>
    </asp:TreeView>
</form>


Dit is de code in de codebehind-file:
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
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void geef_door(object sender, System.EventArgs e)
    {
            AddCategory(0, strName.Text);
    }


    protected void AddCategory(int ID_ParentCategory, string strName)
    {
        string connString = ConfigurationManager.ConnectionStrings["SYS"].ConnectionString;
        string sql = "execute AddMediaCategory "+ ID_ParentCategory +", '"+ strName +"'";
        SqlConnection conn = new SqlConnection(connString);
        conn.Open();
        
        SqlCommand command = new SqlCommand(sql, conn);
        command.ExecuteNonQuery();
        conn.Close();
    }

    private DataSet RunQuery(SqlCommand sqlQuery)
    {
        string connString = ConfigurationManager.ConnectionStrings["SYS"].ConnectionString;
        SqlConnection DBConnection = new SqlConnection(connString);
        SqlDataAdapter dbAdapter = new SqlDataAdapter();
        dbAdapter.SelectCommand = sqlQuery;
        sqlQuery.Connection = DBConnection;
        DataSet resultsDataSet = new DataSet();
        dbAdapter.Fill(resultsDataSet);
        return resultsDataSet;
    }

    void PopulateCategories(TreeNode node)
    {
        SqlCommand sqlQuery = new SqlCommand("execute GetMainMediaCategory");
        DataSet resultSet;
        resultSet = RunQuery(sqlQuery);
        if (resultSet.Tables.Count > 0)
        {
            foreach (DataRow row in resultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new
                TreeNode(row["strName"].ToString(), row["ID_Category"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }
        }
    }

    void PopulateSubCategories(TreeNode node)
    {
        SqlCommand sqlQuery = new SqlCommand();
        sqlQuery.CommandText = "execute GetSubMediaCategory @categoryid";
        sqlQuery.Parameters.Add("@categoryid", SqlDbType.Int).Value = node.Value;
        DataSet ResultSet = RunQuery(sqlQuery);
        if (ResultSet.Tables.Count > 0)
        {
            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new
                TreeNode(row["strName"].ToString(), row["ID_Category"].ToString());
                NewNode.PopulateOnDemand = false;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                NewNode.Expanded = false;
                node.ChildNodes.Add(NewNode);
            }
        }
    }


    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
    
            switch (e.Node.Depth)
            {
                case 0:
                    PopulateCategories(e.Node);
                    break;
                case 1:
                    PopulateSubCategories(e.Node);
                    break;
            }
    }
}


Ik ben zelf (uiteraard) al flink aan het uitproberen geweest, en ik ben er achter gekomen dat dit probleem zich voordoet op het moment dat er postback is. Wanneer ik namelijk de tekst toevoeg in de page_load werkt het wél gewoon, tenzij er postback is. Als ik dan 10x op de submitbutton klik verandert er niets. Als ik vervolgens de pagina weer hard refresh staat de ingevoerde tekst 10x in de treeview (zoals het hoort).

De "oplossing" die ik nu heb is het opnieuw laden van de pagina met een response.redirect die naar zichzelf verwijst. Maar dat is natuurlijk ontzettend onzinnig, om maar niet te spreken van smerig.

Ik vermoed dat het probleem in de treeview zit. Ik heb het idee dat deze in het geval van een postback de OnTreeNodePopulate niet "geactiveerd" wordt.

Ik doe ongetwijfeld iets heel erg doms (ik ben zoals eerder gezegd een ASP.net/C# newbie), dus wijs me er gerust op als ik het sowieso helemaal verkeerd aanpak. Sorry voor het nogal lange bericht, maar ik zou niet weten hoe ik dit korter kan verwoorden.

omniscale.nl


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Gewoon in je Page_Load method de Populate-methods aanroepen.

  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
Mastermind schreef op maandag 24 juli 2006 @ 16:23:
Gewoon in je Page_Load method de Populate-methods aanroepen.
Nog even ten overvloede: ik ben een newbie ;)

Moet ik me er zoiets bij voorstellen:
C#:
1
TreeView1.TreeNodePopulate();


Want dat werkt niet.

omniscale.nl


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
De Page_Load wordt aangeroepen bij een PostBack, dit gebeurt nadat er bijv. een event afgevuurd wordt. Maar normaal zou je juist moeten vermijden dat hij alles refresht door een event.

Ik zie dat je ook geen DataSource hebt ingesteld. Het lijkt me dat je nog zoiets als TreeView.DataSource = resultset moet hebben.

(Heb zelf nooit een TreeView gebruikt)

Dan zou je zoiets moeten krijgen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
private void Page_Load(object sender, System.EventArgs e)
{
    if (!IsPostBack)
    {   
    BindTreeView();
    }
}

private void BindTreeView()
{
// maak global resultset, vul deze
TreeView1.Datasource =  resultset;
}

  • wboevink
  • Registratie: September 2004
  • Laatst online: 09-02 17:21
Mastermind schreef op maandag 24 juli 2006 @ 16:42:
Ik zie dat je ook geen DataSource hebt ingesteld. Het lijkt me dat je nog zoiets als TreeView.DataSource = resultset moet hebben.
Een treeview heeft geen datasource (helaas)

  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
wboevink schreef op maandag 24 juli 2006 @ 16:45:
[...]


Een treeview heeft geen datasource (helaas)
Nope. Vandaar ook die hele omslachtige manier om dat ding te vullen. :)

omniscale.nl


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Dan zou je even in de methods van de treeview moeten kijken of er ergens een soort van Refresh() ofzo zit, en deze aanroepen in de geef_door() method.

  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
Mastermind schreef op maandag 24 juli 2006 @ 16:53:
Dan zou je even in de methods van de treeview moeten kijken of er ergens een soort van Refresh() ofzo zit, en deze aanroepen in de geef_door() method.
Dat was ook mijn eerste idee, maar volgens mij bestaat er dus geen Refresh of iets wat daar op lijkt. Wat ik wel heel raar vind overigens...

omniscale.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14-02 12:34

gorgi_19

Kruimeltjes zijn weer op :9

posttoast schreef op maandag 24 juli 2006 @ 16:54:
[...]

Dat was ook mijn eerste idee, maar volgens mij bestaat er dus geen Refresh of iets wat daar op lijkt. Wat ik wel heel raar vind overigens...
Een refresh is het opnieuw toevoegen van een datasource + binden; wat zou jij dan als refresh zien? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
gorgi_19 schreef op dinsdag 25 juli 2006 @ 09:17:
[...]

Een refresh is het opnieuw toevoegen van een datasource + binden; wat zou jij dan als refresh zien? :)
Daar heb jij weer gelijk in :)

Maar het punt is (of ik moet het helemaal verkeerd begrijpen) dat er geen datasource is. Ik voeg gewoon rechtstreeks die nodes toe.

Hoe zou ik volgens jou, met mijn code (of iets wat daarop lijkt), dit moeten aanpakken?

omniscale.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14-02 12:34

gorgi_19

Kruimeltjes zijn weer op :9

posttoast schreef op dinsdag 25 juli 2006 @ 09:33:
[...]

Daar heb jij weer gelijk in :)

Maar het punt is (of ik moet het helemaal verkeerd begrijpen) dat er geen datasource is. Ik voeg gewoon rechtstreeks die nodes toe.

Hoe zou ik volgens jou, met mijn code (of iets wat daarop lijkt), dit moeten aanpakken?
Je treeview clearen en opnieuw toevoegen oid? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
gorgi_19 schreef op dinsdag 25 juli 2006 @ 09:43:
[...]

Je treeview clearen en opnieuw toevoegen oid? :)
Het punt is: ik zie door de bomen het bos niet meer helemaal. Kun je een tipje van de sluier geven zodat ik ongeveer weet hoe ik dat moet doen, of begin ik nu wel heel erg als een wanhopige prutser te klinken? :)

omniscale.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14-02 12:34

gorgi_19

Kruimeltjes zijn weer op :9

posttoast schreef op dinsdag 25 juli 2006 @ 09:46:
[...]

Het punt is: ik zie door de bomen het bos niet meer helemaal. Kun je een tipje van de sluier geven zodat ik ongeveer weet hoe ik dat moet doen, of begin ik nu wel heel erg als een wanhopige prutser te klinken? :)
Na een wijziging een Response.Redirect(Request.RawUrl) doen; hoef je ook geen moeite te doen om de F5 af te vangen :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
gorgi_19 schreef op dinsdag 25 juli 2006 @ 10:03:
[...]

Na een wijziging een Response.Redirect(Request.RawUrl) doen; hoef je ook geen moeite te doen om de F5 af te vangen :)
Dan doe ik dat maar inderdaad :)

Pfff, dat valt allemaal niet mee als je PHP gewend bent. Maar we komen er wel ;)

Bedankt voor de hulp allemaal!

omniscale.nl


  • wboevink
  • Registratie: September 2004
  • Laatst online: 09-02 17:21
Zet anders de viewstate op false van je treeview, dan zou ie het ook moeten doen.

  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
wboevink schreef op dinsdag 25 juli 2006 @ 10:16:
Zet anders de viewstate op false van je treeview, dan zou ie het ook moeten doen.
Gewoon zo?
HTML:
1
<asp:TreeView viewstate="false">

Want dat werkt niet. TreeView heeft geen attribuut viewstate volgens Visual Studio.

omniscale.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14-02 12:34

gorgi_19

Kruimeltjes zijn weer op :9

wboevink schreef op dinsdag 25 juli 2006 @ 10:16:
Zet anders de viewstate op false van je treeview, dan zou ie het ook moeten doen.
Hoezo dan wel? Je zal dan zelf de state moeten verzorgen, ergo: zelf zorgen dat bij iedere request de collectie op orde / gemaakt is. :)
posttoast schreef op dinsdag 25 juli 2006 @ 10:20:
[...]


Gewoon zo?
HTML:
1
<asp:TreeView viewstate="false">

Want dat werkt niet. TreeView heeft geen attribuut viewstate volgens Visual Studio.
Volgens MSDN heeft hij wel degelijk een viewstate, het is alleen EnableViewState. :)

[ Voor 49% gewijzigd door gorgi_19 op 25-07-2006 11:16 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • posttoast
  • Registratie: April 2000
  • Laatst online: 16:36
gorgi_19 schreef op dinsdag 25 juli 2006 @ 11:14:
[...]

Hoezo dan wel? Je zal dan zelf de state moeten verzorgen, ergo: zelf zorgen dat bij iedere request de collectie op orde / gemaakt is. :)


[...]

Volgens MSDN heeft hij wel degelijk een viewstate, het is alleen EnableViewState. :)
My bad :)

Overigens gaat die vlieger zoals je zelf al zegt niet op. Op het moment dat de ViewState disabled is kan hij niet goed opbouwen. Maar jouw oplossing waarbij de pagina zichzelf aanroept werkt prima :) Ik ben (voorlopig) weer even blij met ASP.NET ;)

omniscale.nl

Pagina: 1