Zuerst verstehe ich die Notwendigkeit, dynamische Steuerelemente im OnInit Abschnitt zu erstellen.Dynamische Steuerelemente - C# - CheckBoxList Eltern - Kinder
Allerdings habe ich ein Dokument von Scott Guthrie gelesen?
http://scottonwriting.net/sowblog/archive/2004/10/08/162998.aspx
Also habe ich den Eindruck von diesen Blogs bekam, dass, wenn Sie die Steuerung in den Behälter fügen Sie dann die Eigenschaften ändern, können Sie bei der Kontrolle in der Page_Load zu bekommen.
Kurz gesagt, habe ich eine Tabelle mit einem fk zurück zum Tisch, um eine Hierarchie zu erstellen. Ich lade 3 Benutzer steuert die Seite mit Checkbox-Listen, die durch den übergeordneten Schlüssel beziehen.
Tabelle wie folgt aus:
create table myTbl
(
id int identity,
par_id int,
item_desc varchar(25)
other_desc_flag bit
)
Was meine Kunden brauchen, ist die Fähigkeit, eine Checkbox Auswahl zu treffen. Die untergeordneten Textfelder werden basierend auf dem übergeordneten Element angezeigt. Wenn txt_flag gesetzt ist, wird kein Kontrollkästcheneintrag ausgefüllt. Stattdessen möchten sie das Desc-Label mit einem Textfeld für die Antwort ausgedruckt. Die Benutzerdaten sind übrigens nicht in der obigen Tabelle enthalten.
Also das Problem, das ich habe, ist diese Text-Antworten können auf jeder Ebene des benutzerdefinierten Steuerelements sein. Also habe ich eine Klasse mit 3 Elementen (ID, Literal-Steuerelement und ein Textfeld) erstellt. Ich dann dynamisch die Steuerelemente basierend auf der Auswahl auf einer bestimmten Ebene erstellen.
Ich lese jede Ebene in ein Dataset, ich iteriere durch das Dataset nach diesem Flag suchen. Ich erfasse eine Indexvariable in den Zeilen mit diesem Flag und ich erstelle eine List-Klasse, um die ID, text_desc zu halten. Ich entferne dann die Zeile aus der Tabelle in der Datenmenge und binde die verbleibenden Elemente an die Checkbox-Liste.
Ich gehe dann zurück zu meiner Kontrolle und schreibe dynamisch die Steuerelemente aus.
Aber wie alle vor mir tue ich einen bösen Kampf gegen den Page Cycle ... lol.
Ich kann die Kontrollen nicht sehen. Ich plane, DataBind() meine Kontrollen getrennt auf Last, da ich nicht zu dem Punkt gekommen bin, wo ich die Klientenantworten von der Datenbank empfange. Das ist für einen anderen Tag. Der Platzhalter mit meinen dynamischen Steuerelementen ist OtherPlaceHolder. Ich habe versucht, den Viewstate auf wahr und falsch zu setzen.
Alle Hinweise darauf, wie die Anzahl der Elemente beim Postback in eine Sitzungsvariable abgerufen wird, damit ich die Steuerelemente im OnInit-Abschnitt erstellen kann.
Hier ist der Code. Dies wird von einer Master-Seite ausgeführt wird ...
Auf den Kontrollen, änderte ich die < &> auf [], weil diese Seite, den Code in eine Kontrollbox mit Scrollbalken zu setzen versucht wurde, dass Code abschneidet.
[asp:UpdatePanel ID="UpdPanel" runat="server" EnableViewState="true" UpdateMode="Always"]
[ContentTemplate]
[asp:Table runat="server" ID="ContainerTbl"]
[asp:TableHeaderRow]
[asp:TableHeaderCell ColumnSpan="2" CssClass="tdCell"][asp:Literal ID="LitDesc" runat="server" Text="Level" /][/asp:TableHeaderCell]
[/asp:TableHeaderRow]
[asp:TableRow]
[asp:TableCell runat="server" ID="tblItems" VerticalAlign="top"]
[asp:PlaceHolder runat="server" ID="CtrlPlaceHolder"]
[asp:CheckBoxList ID="cboItems" Visible="false" runat="server" AutoPostBack="true"][/asp:CheckBoxList]
[asp:HiddenField ID="otherCnt" runat="server" /]
[/asp:PlaceHolder]
[asp:PlaceHolder runat="server" ID="OtherPlaceHolder" EnableViewState="false"]
[/asp:PlaceHolder]
[/asp:TableCell]
[/asp:TableRow]
[asp:TableRow]
[asp:TableCell VerticalAlign="top"]
[asp:Label ID="LabMsg" runat="server" CSSClass="tdCell" Font-Bold="true" Visible="false"/]
[/asp:TableCell]
[/asp:TableRow]
[/asp:Table]
[asp:HiddenField ID="hLevel" runat="server" Value="" /]
[/ContentTemplate]
[/asp:UpdatePanel]
private void WriteOutQuestions(List<Questions> qList)
{
int itemCnt = 1;
// clear any controls in other place holder first.
OtherPlaceHolder.Controls.Clear();
Table OTD = new Table();
foreach (Questions qst in qList)
{
// we're going to create the new control and add to
// the placeholder - OtherPlaceholder
// we'll then reference those controls and add the data to those
// controls.
// see dynamic control article: http://scottonwriting.net/sowblog/archive/2004/10/08/162998.aspx
HiddenField hItemId = new HiddenField();
TextBox txtItem = new TextBox();
LiteralControl ltcItem = new LiteralControl();
// add the new controls
string strItemId = "hItem" + Convert.ToString(itemCnt);
string strTxtItem = "txtItem" + Convert.ToString(itemCnt);
string strLtcItem = "ltcItem" + Convert.ToString(itemCnt);
hItemId.ID = strItemId;
hItemId.EnableViewState = true;
txtItem.ID = strTxtItem;
txtItem.EnableViewState = true;
ltcItem.ID = strLtcItem;
ltcItem.EnableViewState = true;
OTD.Controls.Add(OtherDescAddControl(OtherPlaceHolder, hItemId, ltcItem, txtItem));
// now reference the new added controls and set values from Question object...
++itemCnt;
}
OtherPlaceHolder.Controls.Add(OTD);
// now post data to controls...
itemCnt = 1;
foreach (Questions qst in qList)
{
string strItemId = "hItem" + Convert.ToString(itemCnt);
string strTxtItem = "txtItem" + Convert.ToString(itemCnt);
string strLtcItem = "ltcItem" + Convert.ToString(itemCnt);
HiddenField hfld = (HiddenField)OtherPlaceHolder.FindControl(strItemId);
TextBox txtBox = (TextBox)OtherPlaceHolder.FindControl(strTxtItem);
LiteralControl ltx = (LiteralControl)OtherPlaceHolder.FindControl(strLtcItem);
hfld.Value = qst.HFld.ToString();
txtBox.Text = qst.TxtBox;
txtBox.Attributes.Add("class", "txtBox");
ltx.Text = qst.Ltc.ToString();
++itemCnt;
}
//decrement itemCnt and populate box here...
--itemCnt;
HiddenField hfldCnt = (HiddenField)CtrlPlaceHolder.FindControl("otherCnt");
hfldCnt.Value = Convert.ToString(itemCnt);
hfldCnt.Visible = true;
}