Bonjour,
J'aimerais savoir si une meilleure implémentation de ce que je veux faire existe (probablement que oui). Mise en situation :
J'ai une liste de catégories que j'affiche dans une BulletedList à partir d'une base de données. Sur le clic d'un élément dans la liste je souhaite créer une série de contrôles à partir d'informations de la base de données telles que le type (TextBox, DropDownList, CheckBoxList, RadioButtonList), une position ordonnée, une valeur par défaut, etc... En ce moment, j'arrive à créer les contrôles que j'attache à un PlaceHolder dans ma page ASPX.
Le problème survient quand j'appuie sur le bouton pour sauvegarder les informations du formulaire créé dynamiquement dans la base de données. En effet, tous mes contrôles créés dynamiquement disparaissent et je n'ai plus accès à l'information qu'ils contenaient...
Quelle est la bonne façon de faire ce que j'ai décris?
** Si quelqu'un pouvait aussi m'éclairer sur le fait que les variables globales à ma classe sont réinitialisées à tous les PostBack, de ce fait, il m'est impossible de conserver une valeur... On doit utiliser le ViewState pour ce faire? **
Voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using ChecklistsPortal.Lib.BusinessObjects; namespace ChecklistsPortal { public partial class WebChanges : System.Web.UI.Page { private FeatureTypeCollection featColl = FeatureTypeCollection.GetAll(); protected void Page_Load(object sender, EventArgs e) { loadFeatureTypesList(); } private void loadFeatureTypesList() { blFeatureTypes.DataSource = featColl; blFeatureTypes.DataTextField = "FeatureTypeName"; blFeatureTypes.DataValueField = "FeatureTypeId"; blFeatureTypes.DataBind(); } private void loadTemplateFieldsList(int featureTypeId) { TemplateFieldCollection temfColl = TemplateFieldCollection.GetByFeatureId(featureTypeId); foreach (TemplateFieldBO temf in temfColl) { WebControl wcFieldType = null; if (temf.FieldType.FieldTypeName == "TextBox") { wcFieldType = new TextBox(); wcFieldType.ID = "txtTemplateField_" + temf.TemplateFieldId; } else if (temf.FieldType.FieldTypeName == "DropDownList") { wcFieldType = new DropDownList(); wcFieldType.ID = "ddlTemplateField_" + temf.TemplateFieldId; ((DropDownList)wcFieldType).Items.Add(new ListItem(temf.TemplateFieldValue, temf.TemplateFieldId.ToString())); foreach (TemplateFieldBO temfChild in temf.TemplateFieldChildren) { ((DropDownList)wcFieldType).Items.Add(new ListItem(temfChild.TemplateFieldValue, temfChild.TemplateFieldId.ToString())); } } else if (temf.FieldType.FieldTypeName == "CheckBoxList") { wcFieldType = new CheckBoxList(); wcFieldType.ID = "cblTemplateField_" + temf.TemplateFieldId; foreach (TemplateFieldBO temfChild in temf.TemplateFieldChildren) { ((CheckBoxList)wcFieldType).Items.Add(new ListItem(temf.TemplateFieldValue, temf.TemplateFieldId.ToString())); } } else if (temf.FieldType.FieldTypeName == "RadioButtonList") { wcFieldType = new RadioButtonList(); wcFieldType.ID = "rblTemplateField_" + temf.TemplateFieldId; foreach (TemplateFieldBO temfChild in temf.TemplateFieldChildren) { ((RadioButtonList)wcFieldType).Items.Add(new ListItem(temf.TemplateFieldValue, temf.TemplateFieldId.ToString())); } } if (wcFieldType != null) { Label lblFieldName = new Label(); lblFieldName.ID = "lblTemplateField_" + temf.TemplateFieldId; lblFieldName.Text = temf.TemplateFieldName + " :"; lblFieldName.AssociatedControlID = wcFieldType.ID; LiteralControl listItem = new LiteralControl("<li>"); LiteralControl divContainer = new LiteralControl("<div>"); LiteralControl divContainerClose = new LiteralControl("</div>"); LiteralControl listItemClose = new LiteralControl("</li>"); phTemplateFields.Controls.Add(listItem); phTemplateFields.Controls.Add(divContainer); phTemplateFields.Controls.Add(lblFieldName); phTemplateFields.Controls.Add(wcFieldType); phTemplateFields.Controls.Add(divContainerClose); phTemplateFields.Controls.Add(listItemClose); } } } private void saveModificationsWeb() { // Sauvegarder les informations // Les controles n'existent plus rendu ici, alors c'est impossible!! } protected void blFeatureTypes_Click(object sender, BulletedListEventArgs e) { loadTemplateFieldsList(featColl[e.Index].FeatureTypeId); } protected void btnSaveTemplateFields_Click(object sender, EventArgs e) { saveModificationsWeb(); } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <%@ Page Title="" Language="C#" MasterPageFile="~/ChecklistsPortal.Master" AutoEventWireup="true" CodeBehind="WebChanges.aspx.cs" Inherits="ChecklistsPortal.WebChanges" %> <asp:Content ID="ContentHead" ContentPlaceHolderID="head" runat="server"> </asp:Content> <asp:Content ID="ContentBody" ContentPlaceHolderID="contentMasterPage" runat="server"> <div> <asp:Label ID="lblSelectFeatureType" runat="server" Text="Select a feature type : "></asp:Label> <asp:BulletedList runat="server" ID="blFeatureTypes" DisplayMode="LinkButton" onclick="blFeatureTypes_Click"> </asp:BulletedList> </div> <div> <asp:UpdatePanel ID="upTemplateFields" runat="server"> <ContentTemplate> <asp:Label ID="Label1" runat="server" Text="0"></asp:Label> <ul> <asp:PlaceHolder ID="phTemplateFields" runat="server"></asp:PlaceHolder> </ul> <asp:Button ID="btnSaveTemplateFields" runat="server" Text="Save" onclick="btnSaveTemplateFields_Click" /> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="blFeatureTypes" EventName="Click" /> </Triggers> </asp:UpdatePanel> </div> </asp:Content>
Partager