Преобразование списка в композитный элемент управления - PullRequest
1 голос
/ 08 марта 2010

Ссылка ниже показывает составной элемент управления listview в его самой простой форме, однако я не могу расширить это до того, что я пытаюсь сделать.

Как определить шаблоны списка в коде

В моем списке просмотра есть 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>

Итак, чтобы преобразовать это, я должен использовать метод InstantiateIn ITemplate для шаблона layout и шаблона 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")

1 Ответ

0 голосов
/ 08 марта 2010

В вашем контроле вам не нужно генерировать привязку <% #; скорее вы можете просто получить связанный URL-адрес на сервере и назначить его для ссылки, создать HyperLink и выполнить: </p>

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

Где dataItem - это элемент данных для конкретной строки, который вы получаете в методе binddata шаблона элемента, верно?

Я с базы?

НТН.

...