将listview转换为复合控件

时间:2010-03-08 12:28:48

标签: c# asp.net listview composite-controls

下面的链接以最基本的形式显示了listview复合控件,但我似乎无法将其扩展到我想要做的事情。

How to define listview templates in code

我的listview有1个包含2个字段的tablerow。第一个字段包含1个元素,而第二个字段包含2个元素,如下所示。

<asp:ListView ID="lstArticle" runat="server">
    <LayoutTemplate>
            <table id="itemPlaceholder" runat="server">

            </table>
    </LayoutTemplate>
    <ItemTemplate>
    <div class="ctrlArticleList_rptStandardItem">
        <table width="100%">
            <tr>
                <td valign="top" class="ctrlArticleList_firstColumnWidth">
                    <a href="<%# GetURL(Container.DataItem) %>">
                        <%# GetImage(Container.DataItem)%>
                    </a>
                </td>
                <td valign="top">
                    <span class="ctrlArticleList_title">
                        <a href="<%# GetURL(Container.DataItem) %>">
                            <%# DataBinder.Eval(Container.DataItem, "Title") %>
                        </a>
                    </span>                            
                    <span class="ctrlArticleList_date">
                        <%# convertToShortDate(DataBinder.Eval(Container.DataItem, "ActiveDate"))%>
                    </span>                                
                    <div class="ctrlArticleList_standFirst">
                        <%# DataBinder.Eval(Container.DataItem, "StandFirst")%>
                    </div>
                </td>
            </tr>
        </table>
    </div>
    </ItemTemplate>

因此要转换它,我必须使用ITemplate的InstantiateIn方法作为layouttemplate和ItemTemplate。使用DataBinding事件将数据绑定到itemtemplate。

我现在的问题是如何设置ItemTemplate类并绑定上面的ListView ItemTemplate中的值。这就是我到目前为止所做的:

private class LayoutTemplate : ITemplate
    {
        public void InstantiateIn(Control container)
        {
            var table = new HtmlGenericControl("table") { ID = "itemPlaceholder" };
            container.Controls.Add(table);
        }
    }

    private class ItemTemplate : ITemplate
    {
        public void InstantiateIn(Control container)
        {
            var tableRow = new HtmlGenericControl("tr");

            //first field in row
            var tableFieldImage = new HtmlGenericControl("td");
            var imageLink = new HtmlGenericControl("a");
            imageLink.ID = "imageLink";
            tableRow.Controls.Add(imageLink);

            // second field in row
            var tableFieldTitle = new HtmlGenericControl("td");
            var title = new HtmlGenericControl("a");
            tableFieldTitle.Controls.Add(title);
            tableRow.Controls.Add(tableFieldTitle);

            //Bind the data with the controls
            tableRow.DataBinding += BindData;

            //add the controls to the container
            container.Controls.Add(tableRow);
        }

        public void BindData(object sender, EventArgs e)
        {
            var container = (HtmlGenericControl)sender;
            var dataItem = ((ListViewDataItem)container.NamingContainer).DataItem;

            container.Controls.Add(new Literal() { Text = dataItem.ToString() });
        }

ListView中使用的代码中的一个函数仅用于示例:

        public string GetURL(object objArticle)
    {
        ArticleItem articleItem = (ArticleItem)objArticle;

        Article article = new Article(Guid.Empty, articleItem.ContentVersionID);

        return GetArticleURL(article);
    }

摘要

将以下内容转换为复合控件需要做什么:

的GetURL(的Container.DataItem) 的getImage(的Container.DataItem)

的GetURL(的Container.DataItem) DataBinder.Eval(Container.DataItem,“Title”)

convertToShortDate(DataBinder.Eval(Container.DataItem,“ActiveDate”))

DataBinder.Eval(Container.DataItem,“StandFirst”)

1 个答案:

答案 0 :(得分:0)

在您的控件中,您不需要生成&lt;%#binding;相反,您可以在服务器上获取绑定的URL并将其分配给链接,创建HyperLink并执行:

var link = new HyperLink();
link.NavigateUrl = GetUrl(dataItem);
link.ImageUrl = GetImage(dataItem);

dataItem是特定行的数据项,您可以在项模板binddata方法中获取,对吧?

我离开基地吗?

HTH。