我正在编写一个复合控件,它包含一个列表视图来显示项目的表格。通常,在Asp.NET中使用ListView时,我会在代码转发中定义模板。
<asp:ListView runat="server" ID="ArticleList">
<LayoutTemplate>
<div class="ContentContainer">
<div runat="server" id="itemPlaceholder" />
</div>
</LayoutTemplate>
<ItemTemplate>
<div>
<div><%# Eval("Content") %></div>
</div>
</ItemTemplate>
</asp:ListView>
我假设它是这样的:
ListView view = new ListView();
view.LayoutTemplate = .....
view.ItemTemplate = .....
// when do I call these?
view.DataSource = myDataSource;
view.DataBind();
更新:我通过实现ITemplate接口创建了两个模板:
private class LayoutTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var outer = new HtmlGenericControl("div");
var inner = new HtmlGenericControl("div") { ID = "itemPlaceholder" };
table.Rows.Add(row);
container.Controls.Add(table);
}
}
private class ItemTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var inner = new HtmlGenericControl("div");
container.Controls.Add(inner);
}
}
我可以使用以下命令添加它们:
dataList.LayoutTemplate = new LayoutTemplate();
dataList.ItemTemplate = new ItemTemplate();
但是之后我就卡住了,因为container.DataItem是空的。
发布于 2008-09-29 14:50:12
诀窍是在ItemTemplate中订阅项占位符的数据绑定事件。
完整的解决方案:
public class FibonacciControl : CompositeControl
{
public FibonacciControl()
{
// ....
}
protected override void CreateChildControls()
{
base.CreateChildControls();
ListView view = new ListView();
view.LayoutTemplate = new LayoutTemplate();
view.ItemTemplate = new ItemTemplate();
view.DataSource = FibonacciSequence();
view.DataBind();
this.Controls.Add(view);
}
private IEnumerable<int> FibonacciSequence()
{
int i1 = 0;
int i2 = 1;
for (int i = 0; i < Iterations; i++)
{
yield return i1 + i2;
int temp = i1 + i2;
i1 = i2;
i2 = temp;
}
yield break;
}
public int Iterations { get; set; }
private class LayoutTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var ol = new HtmlGenericControl("ol");
var li = new HtmlGenericControl("li") { ID = "itemPlaceholder" };
ol.Controls.Add(li);
container.Controls.Add(ol);
}
}
private class ItemTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var li = new HtmlGenericControl("li");
li.DataBinding += DataBinding;
container.Controls.Add(li);
}
public void DataBinding(object sender, EventArgs e)
{
var container = (HtmlGenericControl)sender;
var dataItem = ((ListViewDataItem)container.NamingContainer).DataItem;
container.Controls.Add( new Literal(){Text = dataItem.ToString() });
}
}
}
发布于 2008-09-18 15:00:08
这个链接能帮上忙吗?Using Templated Controls Programmatically
在设计时生成模板(为了将它们持久化到aspx文件中)有点棘手,但DataBinding将自动工作。
发布于 2008-12-07 21:50:19
在Sonteks示例的基础上,下面是一个创建模板的示例,该模板包含随后使用数据绑定绑定的元素。
public partial class View : PortalModuleBase
{
protected void Page_Load(object sender, EventArgs e)
{
}
#region MasterListView_ItemDataBound
public void MasterListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
ListViewItem objListViewItem = (ListViewItem)e.Item;
ListViewDataItem objListViewDataItem = objListViewItem as ListViewDataItem;
if (objListViewDataItem != null)
{
Tab objTab = (Tab)objListViewDataItem.DataItem;
IEnumerable<Tab> Tabs = CustomData(objTab.TabID);
Label TabIDLabel = (Label)objListViewItem.FindControl("TabIDLabel");
Label TabNameLabel = (Label)objListViewItem.FindControl("TabNameLabel");
TabIDLabel.Text = objTab.TabID.ToString();
TabNameLabel.Text = objTab.TabName;
AddListView(objTab.TabName, objListViewItem, Tabs);
}
}
#endregion
#region CustomData
static IEnumerable<Tab> CustomData(int? ParentID)
{
TabAdminDataContext objTabAdminDataContext = new TabAdminDataContext();
var myCustomData = from Tabs in objTabAdminDataContext.Tabs
where Tabs.ParentId == ParentID
select Tabs;
return myCustomData.AsEnumerable();
}
#endregion
#region AddListView
private void AddListView(string CurrentTabName, Control container, IEnumerable<Tab> ChildTabs)
{
// The Tab has Children so add a ListView
if (ChildTabs.Count() > 0)
{
ListView ChildListView = new ListView();
ChildListView.ID = "ChildListView";
ChildListView.ItemCommand += ListView_ItemCommand;
ChildListView.EnableViewState = true;
ChildListView.LayoutTemplate = new MyLayoutTemplate();
ChildListView.ItemTemplate = new MyItemTemplate();
ChildListView.DataSource = ChildTabs;
ChildListView.DataBind();
// Put the ListView in a Panel
var oTR = new HtmlGenericControl("tr") { ID = "ChildListViewTR" };
var oTD = new HtmlGenericControl("td") { ID = "ChildListViewTD" };
Panel objPanel = new Panel();
objPanel.ID = "ListViewPanel";
objPanel.ToolTip = CurrentTabName;
objPanel.Controls.Add(ChildListView);
oTD.Controls.Add(objPanel);
oTR.Controls.Add(oTD);
container.Controls.Add(oTR);
}
}
#endregion
#region ListView_ItemCommand
protected void ListView_ItemCommand(object sender, ListViewCommandEventArgs e)
{
LinkButton objButton = (LinkButton)sender;
Label1.Text = objButton.Text;
MasterListView.DataBind();
}
#endregion
#region MyLayoutTemplate
public class MyLayoutTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var oTR = new HtmlGenericControl("tr") { ID = "itemPlaceholder" };
container.Controls.Add(oTR);
}
}
#endregion
#region ItemTemplate
public class MyItemTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
var oTR = new HtmlGenericControl("tr");
var oTD1 = new HtmlGenericControl("td");
LinkButton TabIDLinkButton = new LinkButton();
TabIDLinkButton.ID = "TabIDLinkButton";
oTD1.Controls.Add(TabIDLinkButton);
oTR.Controls.Add(oTD1);
var oTD2 = new HtmlGenericControl("td");
Label TabNameLabel = new Label();
TabNameLabel.ID = "TabNameLabel";
oTD2.Controls.Add(TabNameLabel);
oTR.Controls.Add(oTD2);
oTR.DataBinding += DataBinding;
container.Controls.Add(oTR);
}
public void DataBinding(object sender, EventArgs e)
{
var container = (HtmlGenericControl)sender;
var dataItem = ((ListViewDataItem)container.NamingContainer).DataItem;
Tab objTab = (Tab)dataItem;
LinkButton TabIDLinkButton = (LinkButton)container.FindControl("TabIDLinkButton");
Label TabNameLabel = (Label)container.FindControl("TabNameLabel");
TabIDLinkButton.Text = "+" + objTab.TabID.ToString();
TabNameLabel.Text = objTab.TabName;
IEnumerable<Tab> ChildTabs = View.CustomData(objTab.TabID);
View objView = new View();
objView.AddListView(objTab.TabName, container, ChildTabs);
}
}
#endregion
}
https://stackoverflow.com/questions/92689
复制相似问题