Ich versuche, verschachtelte Repeater dynamisch mit ITemplate zu erstellen. Dieser Repeater ist so, dass ich List<Control>
übergebe und es Repeater generiert. Problem ist, dass wenn ich einen äußeren Repeater bestimme. Nur der letzte verschachtelte Repeater zeigt. Folgendes ist Screenshot. screen shot http://i40.tinypic.com/axjwpf.jpgDynamischer Repeater in C# .net
Markup
<%@ 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>
Code hinter
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;
}
}
}
}
Wie pro meines Wissens Aufruf databind hierarchisch ist. Ich meine, der Anruf zum Elternteil wird bewirken, dass alle untergeordneten Steuerelemente so wie es geht. Das ist was passiert. Sonst wird auch die letzte Zeile nicht angezeigt. – Mohit