.net – 如何在代码中定义listview模板
发布时间:2020-12-16 00:19:38 所属栏目:asp.Net 来源:网络整理
导读:我正在编写一个Composite控件,它包含一个listview来显示一个项目表.通常在Asp.NET中使用ListView时,我会在代码转发中定义模板. asp:ListView runat="server" ID="ArticleList" LayoutTemplate div class="ContentContainer" div runat="server" id="itemPlac
我正在编写一个Composite控件,它包含一个listview来显示一个项目表.通常在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(); 更新: 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为null. 解决方法
诀窍是订阅ItemTemplate中itemplaceholder的数据绑定事件.
完整的解决方案: 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() }); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-core – Microsoft.AspNetCore.NodeServices:无法
- asp.net-mvc – 在ASP.NET MVC 4中的用户控制等效
- asp.net – 如何在构建期间从Visual Studio调用aspnet_comp
- asp.net core 2.0 spa角谷歌地图
- asp.net-mvc – Ninject和连接字符串
- asp.net-mvc – 单元测试MVC控制器
- asp.net – 在Windows 7笔记本电脑中找不到IIS_IUSRS组
- asp.net – JSON字符串中的反斜杠
- asp.net-mvc – MVC HTML.RenderAction – 错误:持续时间必
- asp.net-mvc-2 – 如何设置RadioButtonFor()在ASp.net MVC
推荐文章
站长推荐
- asp.net-mvc – 可以将NUnit集成到Visual Studio
- asp.net – NHibernate – 访问同一数据库的两个
- asp.net-web-api – 仅在第一个Web请求(WebAPI 2
- asp.net-mvc – 如何在MVC中测试ModelMetadata.F
- asp.net – Global.asax没有为Release版本触发
- asp.net – 渗透测试人员说.ASPXAUTH cookie是不
- asp.net – 我应该在我的HttpHandler中设置IsReu
- asp.net – 为什么WebMethod声明为静态?
- asp.net-core – 入口点没有合适的“程序”类型
- asp.net-mvc – ViewBag和ViewData也是asp.net m
热点阅读