
How to define listview templates in code
我正在编写一个Composite控件,其中包含一个用于显示项目表的列表视图。 通常,在Asp.NET中使用ListView时,我会在代码转发中定义模板。
1 2 3 4 5 6 7 8 9 10 11
| <LayoutTemplate>
</LayoutTemplate>
<ItemTemplate>
<%# Eval("Content") %>
</ItemTemplate>
</asp:ListView> |
我认为是这样的:
1 2 3 4 5 6 7
| ListView view = new ListView();
view.LayoutTemplate = .....
view.ItemTemplate = .....
// when do I call these?
view.DataSource = myDataSource;
view.DataBind(); |
更新:
我通过实现ITemplate接口创建了2个模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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);
}
} |
我可以使用添加它们:
1 2
| dataList.LayoutTemplate = new LayoutTemplate();
dataList.ItemTemplate = new ItemTemplate(); |
但是然后我被卡住了,因为container.DataItem为null。
诀窍是在ItemTemplate中订阅itemplaceholder的数据绑定事件。
完整的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| 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() });
}
}
} |
此链接可能会有帮助吗? 以编程方式使用模板控件
在设计时生成模板(以便将其保存在aspx文件中)有点棘手,但是DataBinding将自动工作。
这是一个基于Sonteks示例的示例,该示例创建一个模板,该模板包含随后使用数据绑定绑定的元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| 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
} |
设置一个类似的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public delegate void InstantiateTemplateDelegate(Control container);
public class GenericTemplateImplementation : ITemplate
{
private InstantiateTemplateDelegate instantiateTemplate;
public void InstantiateIn(Control container)
{
this.instantiateTemplate(container);
}
public GenericTemplateImplementation(InstantiateTemplateDelegate instantiateTemplate)
{
this.instantiateTemplate = instantiateTemplate;
}
} |
然后执行以下操作:
1 2 3 4
| view.LayoutTemplate = new GenericTemplateImplementation(p =>
{
p.Controls.Add(new Label { Text ="Foo" });
}); |
|
视图列表模板显示
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。