Создание серверных элементов управления динамически во время выполнения внутри шаблона элемента сетки - PullRequest
2 голосов
/ 06 августа 2010

У меня есть шаблон элемента внутри сетки, в котором есть <asp:LinkButton/>.Я назначаю текст для кнопки ссылки как

<%# Convert.ToString(Eval("Tags"))%>

Теги могут содержать строку с несколькими тегами, разделенными пробелом.Например,"sports", "sports cricket", "sports cricket sachin" - примеры некоторых возможных тегов.

Я хочу создать кнопку для каждого тега в строке.Как я могу динамически создавать элементы управления (серверный элемент управления - linkbutton) во время выполнения внутри шаблона элемента сетки?

Спасибо

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Я предполагаю, что сетка, на которую вы ссылаетесь, является сеткой данных?

Этот урок имеет отличный пример. Подведем итог:

Добавьте столбец Шаблон в сетку вместо столбца кнопки ссылки:

<asp:datagrid id="dataGrid1" runat="server" Width="792px" 

    AutoGenerateColumns="False" 
    CellPadding="0" >

    <Columns>


        <asp:BoundColumn DataField="id" HeaderText="ID"> 
            <HeaderStyle Width="190px" HorizontalAlign="Center" >
            </HeaderStyle> 
        </asp:BoundColumn> 


        <asp:TemplateColumn HeaderText="Tags" 
                     HeaderStyle-HorizontalAlign="Center"> 
            <ItemStyle HorizontalAlign="Left" Wrap="True"></ItemStyle> 
            <ItemTemplate> 
                <asp:Repeater ID="rptChild" runat="server" DataSource='<%# DataBinder.Eval(Container.DataItem, "tags").ToString().Split(tagSplitChars) %>'> 
                    <ItemTemplate> 
                        <asp:LinkButton ID="linkChild" 
                        runat="server" 
                            CommandArgument="<%# Container.DataItem%>"
                            > 
                            <%# Container.DataItem%> 
                        </asp:LinkButton> 
                    </ItemTemplate> 
                </asp:Repeater> 
            </ItemTemplate> 
        </asp:TemplateColumn> 
    </Columns> 
    <PagerStyle PageButtonCount="20" Mode="NumericPages"></PagerStyle> 
</asp:datagrid>

Обратите внимание, что tagSplitChars должен быть определен в вашем коде как:

 protected char[] tagSplitChars  = new char[] { ' '};

Очевидно, что вы можете добавить обработчик «onclick» к кнопке ссылки, как вам нужно.

Я проверил это с этим кодом, и он отлично работает:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        public char[] splitChars = new char[] { ' '};
        protected void Page_Load(object sender, EventArgs e)
        {
            dataGrid1.DataSource = new List<dynamic>() { new { id = 1, names = "one single" }, new { id = 2, names = "two double" } };
            dataGrid1.DataBind();
        }

    }
}

UPDATE

Если вы просто пытаетесь добавить список кнопок и у вас нет других столбцов для отображения в вашей сетке, вы можете значительно упростить решение:

<asp:Repeater ID="rptChild" runat="server" > 
    <ItemTemplate> 
        <asp:LinkButton ID="linkChild" runat="server"> 
             <%# Container.DataItem%> 
        </asp:LinkButton> 
    </ItemTemplate> 
</asp:Repeater> 

Тогда в коде

        protected void Page_Load(object sender, EventArgs e)
        {
            dataGrid1.DataSource = myTagsString.split(splitChars);
            dataGrid1.DataBind();
        }

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

0 голосов
/ 06 августа 2010

Если теги находятся в одном столбце таблицы данных, создайте запрос select Sql, который извлекает значения тегов из него и назначает таблицу данных результата или считыватель в качестве источника сетки.Если некоторые значения столбцов содержат несколько тегов, разделенных запятой, разбивайте их во время выполнения, как предложил Джайлс.

...