c# - 在运行时在网格项模板内动态创建服务器控件

标签 c# asp.net grid dynamic

我在网格中有一个项目模板,它有一个 <asp:LinkButton/>在里面。我将链接按钮的文本指定为

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

标签可以有一个字符串,其中包含多个标签,由空格分隔。例如。 “sports”、“sports cricket”、“sports cricket sachin”是一些可能的标签示例。

我想为字符串中的每个标签创建一个按钮。我如何在运行时在网格项模板内动态创建控件(服务器控件 - 链接按钮)?

谢谢

最佳答案

我假设您所指的网格是数据网格?

This tutorial有一个很好的例子。总结:

将模板列添加到您的 GridView 以代替链接按钮列:

<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();
        }

    }
}

更新

如果您只是想添加一个按钮列表,并且没有其他列显示在您的网格中,您可以显着简化解决方案:

<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();
        }

很明显,您必须手动访问数据表中的数据才能提取字符串,已经有一段时间没有这样做了,但从内存来看它非常简单。

关于c# - 在运行时在网格项模板内动态创建服务器控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3422096/

相关文章:

c# - 可移植库上是否有替代 AppDomain.GetAssemblies 的方法?

c# - 序列包含多个元素

asp.net - 何时使用 PageAsyncTask 的示例(异步 asp.net 页面)

extjs - 从存储分页内存中删除记录后刷新 Extjs 网格

html - 网格属性不适用于网格容器内的元素

asp.net-mvc-3 - Telerik MVC 网格。在客户端分组

类型为 "application/x-www-form-urlencoded"的 C# HttpWebRequest - 如何在内容正文中发送 '&' 字符?

c# - 使用 Membership.CreateUser 时数据保存在哪里?

c# - ASP.net 中的 session 变量是否有限制?

c# - 使用 C# 在 outlook 中更改发件人