C# 将listview转换为复合控件

C# 将listview转换为复合控件,c#,asp.net,listview,composite-controls,C#,Asp.net,Listview,Composite Controls,下面的链接以最基本的形式显示了一个listview复合控件,但是我似乎无法将其扩展到我正在尝试做的事情 我的listview有1个tablerow和2个字段。第一个字段包含1个元素,而第二个字段包含2个元素,如下所示 <asp:ListView ID="lstArticle" runat="server"> <LayoutTemplate> <table id="itemPlaceholder" runat="server">

下面的链接以最基本的形式显示了一个listview复合控件,但是我似乎无法将其扩展到我正在尝试做的事情

我的listview有1个tablerow和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>
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”)

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


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

在您的控件中,您不需要为响应生成感谢,也不确定您的意思是“其中DataItem是特定行的数据项,您可以在item模板binddata方法中获得”我的意思是binddata有以下内容:var Container=(HtmlGenericControl)sender;var dataItem=((ListViewDataItem)container.NamingContainer).dataItem;其中dataitem是基础数据源。数据项将是您的下方数据对象。如果从中提取字段时遇到问题,可以使用DataBinder.Eval或DataBinder.GetPropertyValue从对象中提取值。我丢失了:)1。我使用ItemTemplate类的方法正确吗?-我已经创建了table/row/td/span/divs元素及其相应的属性,因此现在它应该反映设计页面。2.我是否使用服务器控件而不是html控件(例如HyperLink而不是)3.我是否在与设计页面相同的点绑定数据。所以有6次我需要绑定数据。4.在设计规范中,使用了两种类型的数据绑定。第一种方法将数据对象传递给函数,第二种方法从数据对象获取字段名。这在ITemplate类中是如何实现的?1)我不确定使用ItemTemplate类的原因;这是为了代码重用吗?我个人不喜欢创建编程模板,除非我必须这样做,因为它们需要做很多工作。但是您可以像现在这样通过编程创建控件和元素,这导致2)您可以使用其中任何一个,但是在绑定或设置数据值的地方,我认为使用服务器cotnrols更容易。3) 视情况而定,你需要吗?您可以通过存储标志并在其为true时跳过来防止entra绑定。4) 数据可以通过ItemTemplate构造函数传入(字段名可以是)。感谢您的持续帮助。我要么就快到了,要么就得重写它。部分问题的答案-1。在我的在线研究和本页顶部的链接中,都使用一个ItemTemplate类和一个LayoutTemplate类来派生ITemplate。我希望这不是必需的,因为我必须传递大量的参数来设置cssclass,我想我需要对交替模板做同样的事情。2.我使用html控件简化代码。3&4我通过构造函数传递了数据,但是我必须对AlternateTemplate做同样的事情。
        public string GetURL(object objArticle)
    {
        ArticleItem articleItem = (ArticleItem)objArticle;

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

        return GetArticleURL(article);
    }
var link = new HyperLink();
link.NavigateUrl = GetUrl(dataItem);
link.ImageUrl = GetImage(dataItem);