2011-01-12 14 views
2

まず、OnInitセクションに動的コントロールを作成する必要があることを理解しています。動的コントロール - C# - CheckBoxList親 - 子

しかし、Scott Guthrieの文書を読みましたか?

http://scottonwriting.net/sowblog/archive/2004/10/08/162998.aspx

だから私は、あなたがプロパティを変更、コンテナにコントロールを追加した場合、あなたはPage_Loadの中に制御で得ることができることをこれらのブログからの印象を受けました。

一言で言えば、私は階層を作成するテーブルに戻ってfkを持つテーブルを持っています。 私は、3つのusercontrolsをロードする親キーを介して戻るチェックボックスのリストを持つページ。このような

表:

create table myTbl 
(
id int identity, 
par_id int, 
item_desc varchar(25) 
other_desc_flag bit 
) 

私のクライアントは、必要なものは、チェックボックスの選択を行う能力です。 テキストボックスの子セットは、親に基づいて表示されます。 txt_flagが設定されている場合、チェックボックスの入力は行われません。 代わりに、descラベルを応答用のテキストボックスで印刷します。 途中でユーザーデータが上記の表に保持されていません。

私はこれらのテキスト応答がカスタムコントロールの任意のレベルにある可能性があるので、問題があります。 私は3つの項目(ID、リテラルコントロール、およびテキストボックス)を持つクラスを作成しました。 次に、特定のレベルの選択に基づいてコントロールを動的に作成します。

私は各レベルをデータセットに読み込み、そのフラグを探してデータセットを反復処理します。 このフラグを持つ行にインデックス変数を取り込み、 というid、text_descを保持するListクラスを作成します。その後、データセットのテーブルから行を削除し、残りの項目をチェックボックスリストにバインドします。

私は自分のコントロールに戻り、コントロールを動的に書き出します。

私の前のすべての人のように、私はPage Cycle ... Lolに対して邪悪な戦いをしています。

コントロールが表示されません。私はDataBind()私のコントロールは、データベースからクライアントreponsesを得ているポイントになっていないので、負荷で別に私のコントロールを計画しています。それは別の日です。私の動的なコントロールを持つプレースホルダーはOtherPlaceHolderです。 Viewstateをtrueとfalseに設定しようとしました。

私はOnInitセクションでコントロールを作成できるように、セッション変数にポストバックのアイテム数を取得する方法に関するすべてのポインタ。

ここにコードがあります。 にスクロールバーを持つcontrolboxをコードを配置しようと、このページがそのコードを切断したため、これはコントロールに

...マスターページから実行されて、私は[]に> < &を変更しました。あなたは「私がコントロールを見ることができない」と言うとき、あなたはHTMLがそれらを含んでいないことをポストバックでそれらにアクセスする(というよりもしようとしたとき、あなたがnull参照を取得していることを意味するものと仮定すると

[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] 
    &nbsp; 
     [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; 
    } 

答えて

0

)、あなたはPage.EnsureChildControls()を使ってみましたか?

0

私があなたの質問を正しく理解していれば、コントロールを保存してポストバックに戻したいと思っています。あなたができることは次のとおりです。

List<HiddenField> HiddenFields = new List<HiddenField>{}; 
List<TextBox> TextBoxs = new List<TextBox>{}; 
List<LiteralControl> LiteralControls = new List<LiteralControl>{}; 


OTD.Controls.Add(OtherDescAddControl(OtherPlaceHolder, hItemId, ltcItem, txtItem)); 
// do this for all your items that you load to page (add them to your list). 
HiddenFields.Add(hItemId); 
// when you are done with loading all your controls to page, add your populated Lists      to session. 
Session["HiddenFields"] = HiddenFields; 


//On Page_Init or Page_Load, simpy load them back IF **page is postback**. 
If(Page.IsPostBack) 
{ 
    LoadControlsFromSession(); 
} 

private void LoadControlsFromSession() 
{ 
    HiddenFields = Session["HiddenFields"] as List<HiddenFields>; 
    // Load all your List objects from session like above. 
    int counter = 0; 
    if(HiddenFields != null) 
    { 
     foreach(HiddenField hdnField in HiddenFields) 
     { 
      //load your objects with the same method you have from your List. 
      OTD.Controls.Add(OtherDescAddControl(OtherPlaceHolder, HiddenFields[counter], LiteralControls[counter], TextBoxs[counter])); 
      counter++; 
     } 
    } 
} 
0

わかりにくいことをお詫び申し上げます。

私はコントロールを作成し、ポストバックでnullだった私のクラスでセッション変数を設定しようとしたと思います。私は、ページのinitとpreloadとzipでセッション変数にアクセスしようとしました。

私はこの問題に興味深い回避策を見つけました。 page_unloadで私はデータベースIDのハッシュテーブルのarraylistにコントロールを解析しました&ユーザーのテキスト入力の答え。

関連する問題