1

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

如何在代码中定义列表视图模板

我的列表视图有 1 个表行和 2 个字段。第一个字段包含 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 方法用于布局模板和 ItemTemplate。使用 DataBinding 事件将数据绑定到项目模板。

我目前的问题是如何设置 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, "标题")

convertToShortDate(DataBinder.Eval(Container.DataItem, "ActiveDate"))

DataBinder.Eval(Container.DataItem, "StandFirst")

4

1 回答 1

0

在您的控制中,您不需要生成 <%# 绑定;相反,您可以在服务器上获取绑定的 URL 并将其分配给链接,创建超链接并执行以下操作:

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

其中 dataItem 是特定行的数据项,您可以在项模板 binddata 方法中获得它,对吗?

我不在基地吗?

HTH。

于 2010-03-08T14:15:21.240 回答