2009-04-04 7 views
0

私は、ITemplateを使用して動的にネストされたリピータを作成しようとしています。このリピータは、私がList<Control>を渡しているようなもので、リピータを生成します。問題は、私が外部リピータをデータバインドしたときです。最後のネストされたリピータのみが表示されます。以下はスクリーンショットです。 screen shot http://i40.tinypic.com/axjwpf.jpgC#の動的リピータ

マークアップ


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Restricted_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <table style="border:solid 1px black;"> 
     <tr> 
      <td> 
       <asp:PlaceHolder ID="phControls" runat="server" /> 
      </td> 
     </tr> 
    </table> 
    </div> 
    </form> 
</body> 
</html> 

コードビハインド



using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data; 

public partial class Restricted_Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     CreateNestedRepeater(); 
    } 

    private void CreateNestedRepeater() 
    { 
     Repeater childRpt = new Repeater(); 
     List repeatingRuleControls = new List(); 
     repeatingRuleControls.Add(new TextBox()); 
     repeatingRuleControls.Add(new TextBox()); 
     repeatingRuleControls.Add(new TextBox()); 
     RepeatingRuleTemplate repeatingRuleTemplate = new RepeatingRuleTemplate(ListItemType.Item, repeatingRuleControls); 
     childRpt.HeaderTemplate = new RepeatingRuleTemplate(ListItemType.Header, repeatingRuleControls); 
     childRpt.ItemTemplate = repeatingRuleTemplate; 
     childRpt.FooterTemplate = new RepeatingRuleTemplate(ListItemType.Footer, null); 
     childRpt.DataSource = new DataRow[4]; 

     Repeater parentRpt = new Repeater(); 
     repeatingRuleControls = new List(); 
     repeatingRuleControls.Add(new TextBox()); 
     repeatingRuleControls.Add(new TextBox()); 
     repeatingRuleControls.Add(new TextBox()); 
     repeatingRuleControls.Add(childRpt); 
     RepeatingRuleTemplate parentrepeatingRuleTemplate = new RepeatingRuleTemplate(ListItemType.Item, repeatingRuleControls); 
     parentRpt.HeaderTemplate = new RepeatingRuleTemplate(ListItemType.Header, repeatingRuleControls); 
     parentRpt.ItemTemplate = parentrepeatingRuleTemplate; 
     parentRpt.FooterTemplate = new RepeatingRuleTemplate(ListItemType.Footer, null); 
     parentRpt.DataSource = new DataRow[4]; 
     parentRpt.DataBind(); 
     phControls.Controls.Add(parentRpt); 
    } 

    public class RepeatingRuleTemplate : ITemplate 
    { 
     ListItemType templateType; 
     List innerControls; 

     public RepeatingRuleTemplate(ListItemType type, List controls) 
     { 
      templateType = type; 
      innerControls = controls; 
     } 



     public void InstantiateIn(Control container) 
     { 
      PlaceHolder ph = new PlaceHolder(); 

      switch (templateType) 
      { 
       case ListItemType.Header: 
        ph.Controls.Add(new LiteralControl("")); 
        ph.Controls.Add(new LiteralControl("")); 
        foreach (Control control in innerControls) 
        { 
         Label label = new Label(); 
         label.Text = control.ID; 
         ph.Controls.Add(new LiteralControl("")); 
         ph.Controls.Add(label); 
         ph.Controls.Add(new LiteralControl("")); 
        } 
        ph.Controls.Add(new LiteralControl("")); 
        break; 
       case ListItemType.Item: 
        ph.Controls.Add(new LiteralControl("")); 

        foreach (Control control in innerControls) 
        { 
         if (control.GetType() != typeof(Repeater)) 
         { 
          ph.Controls.Add(new LiteralControl("")); 
          TextBox textBox = new TextBox(); 
          textBox.ID = control.ID; 
          ph.Controls.Add(textBox); 
          ph.Controls.Add(new LiteralControl("")); 
         } 
         else 
         { 
          ph.Controls.Add(new LiteralControl("")); 
          ph.Controls.Add(control as Repeater); 
          //(control as Repeater).DataSource = new DataRow[4]; 
          // (control as Repeater).DataBind(); 
          ph.Controls.Add(new LiteralControl("")); 
         } 
        } 
        ph.Controls.Add(new LiteralControl("")); 
        //ph.DataBinding += new EventHandler(Item_DataBinding); 
        break; 
       case ListItemType.Footer: 
        ph.Controls.Add(new LiteralControl("")); 
        break; 
      } 
      container.Controls.Add(ph); 
     } 



     public List Controls 
     { 
      get 
      { 
       return innerControls; 
      } 
     } 

    } 
} 

答えて

0

[OK]をみんなは私も....皆のおかげでそれを考え出しました。私は間違いをしていた。テンプレートクラスはwrong.Iがそれを固定し、今ではデータバインドに私の知識呼び出しごととしてクラスです

 

public class RepeatingRuleTemplate : ITemplate 
    { 
     ListItemType templateType; 
     List innerControls;

public RepeatingRuleTemplate(ListItemType type, List<Control> controls) { templateType = type; innerControls = controls; } public void InstantiateIn(Control container) { PlaceHolder ph = new PlaceHolder(); switch (templateType) { case ListItemType.Header: ph.Controls.Add(new LiteralControl("<table border=\"0\">")); ph.Controls.Add(new LiteralControl("<tr>")); foreach (Control control in innerControls) { Label label = new Label(); label.Text = control.ID; ph.Controls.Add(new LiteralControl("<td>")); ph.Controls.Add(label); ph.Controls.Add(new LiteralControl("</td>")); } ph.Controls.Add(new LiteralControl("</tr>")); break; case ListItemType.Item: ph.Controls.Add(new LiteralControl("<tr>")); foreach (Control control in innerControls) { //ph.Controls.Add(new LiteralControl("<td>")); //ph.Controls.Add(control as TextBox); //ph.Controls.Add(new LiteralControl("</td>")); if (control.GetType() != typeof(Repeater)) { ph.Controls.Add(new LiteralControl("<td>")); TextBox textBox = new TextBox(); textBox.ID = control.ID; ph.Controls.Add(textBox); ph.Controls.Add(new LiteralControl("</td>")); } else { ph.Controls.Add(new LiteralControl("<td>")); Repeater rpt = new Repeater(); rpt.DataSource = (control as Repeater).DataSource; rpt.ItemTemplate = (control as Repeater).ItemTemplate; rpt.HeaderTemplate = (control as Repeater).HeaderTemplate; rpt.FooterTemplate = (control as Repeater).FooterTemplate; rpt.DataBind(); ph.Controls.Add(rpt); //(control as Repeater).DataSource = new DataRow[4]; // (control as Repeater).DataBind(); ph.Controls.Add(new LiteralControl("</td>")); } } ph.Controls.Add(new LiteralControl("</tr>")); //ph.DataBinding += new EventHandler(Item_DataBinding); break; case ListItemType.Footer: ph.Controls.Add(new LiteralControl("</table>")); break; } container.Controls.Add(ph); } public List<Control> Controls { get { return innerControls; } } }

0

parentRpt.ItemDataBoundイベントのハンドラを作成し、childRptのDataSourceプロパティを設定し、そこからchild.Rpt.DataBind()を呼び出す必要があります。

+0

をFollwoingチャーム のように働いている階層です。私は親にコールすることで、すべての子コントロールがそのままデータバインドされることになります。これが起こっていることです。さもなければ、最後の列でさえwoulsは表示されません。 – Mohit

0

なぜカスタムコントロールを作成してコードに記入するだけでいいのですか?

override CreateChildControls(){ 

    foreach(var r in rows) 
    { 
    ... 
    } 
} 

テンプレート、その上repreatersとしているだけでは、すべて手動でビルドするとき、私はすべてのそのプレースホルダ、テンプレートでovercomplicateのように...

理由を見ることができない設計expirience良く、自分の状況にあるようにするには

CompositeControlをビルドしてコードで埋めてください。あなたはあなたのコードを2回減らし、あなたが読むことができるコードを最高にするでしょう。子の再作成者のDataSourceプロパティをワイヤリングするために厄介なイベントを起こす。

ハードofftopのため申し訳ありません...

+0

それは解決策であることができます。しかし、この質問は全体の問題の小さなピクッとしています。私がしようとしているWhtは、ネストされたrpts frm xml.Tht XMLは実際にはリピータ内のコントロールを検証するために私たちのcompで定義された標準です。これらのルールをテストするUIを生成しようとしています。だから、私はrptsを使いたい。 – Mohit

+0

これは私の初めてのスタックオーバーフローです。私は再びコメントできないと思っていました。なぜ私はチャットの言葉を使ったのですか?そのために残念。 – Mohit