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:
Dit is de code in de codebehind-file:
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.
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
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.