gpt4 book ai didi

asp.net - 动态更改 GridView 项模板

转载 作者:行者123 更新时间:2023-12-02 03:46:48 25 4
gpt4 key购买 nike

我有一个相当大的 asp.net 网站,它在很多地方使用绑定(bind)到同一对象的 GridView。我正在使用项目模板来自定义每一行。但是,要在所有页面中使用相同的模板,我必须将项目模板复制并粘贴到每个页面。显然这不是最好的解决方案。除此之外,我希望能够通过更改一些配置文件来更改 GridView 使用的模板。一种选择是使用 DataGrid 创建用户控件并公开要在每个页面中使用的必要属性。然而,这并不能满足能够动态更改模板的第二个要求。基本上我正在寻找一种方法来告诉 GridView 使用模板并能够动态地执行此操作。任何想法都会有帮助。

最佳答案

为了实现您想要的目标,在我看来,您有两种选择:

1.) 在代码中动态构建每个 TemplateField,并根据某些配置切换它们。
2.) 为自定义网格创建用户控件并使用它们。

我知道您说过您不想使用 UserControl,因为这会剥夺您动态更改布局的能力,但让我用一个示例来挑战这个假设。

您可以利用内置的 ASP.Net 功能,通过 PlaceHolder Control 动态切换用户控件以满足您的喜好。 .

<asp:PlaceHolder ID="GridViewPlaceHolder" runat="server" />

您的自定义网格可以在 .ascx 文件中以声明方式构建,然后在运行时动态加载到位,如下所示:

GridViewPlaceHolder.Controls.Add(LoadControl("~/Controls/MyCustomControl.ascx"));

现在,如果您确实想让您的生活更轻松,那么您可以创建一个抽象基类,所有自定义网格控件都将从该基类继承。这样,您的控件在加载时就可以被通用地对待。

public abstract class CustomGridControl: System.Web.UI.UserControl
{
public abstract Object DataSource { get; set; }
}

可以在标记中定义一个简单的网格:

<asp:GridView ID="myGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label Text='<%#Eval("Name") %>' runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Age">
<ItemTemplate>
<asp:Label Text='<%#Eval("Age") %>' runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

该控件背后的代码将如下所示:

public partial class SimpleGrid : CustomGridControl
{
public override object DataSource
{
get { return myGridView.DataSource; }
set { myGridView.DataSource = value; }
}
}

现在,利用它的页面或控件只需转换为基类,您就可以通用地使用它。以下是如何使用它的简单示例,但我认为它清楚地说明了这一点:

protected void Page_Load(object sender, EventArgs e)
{
var dataSource = new List<MyCustomClass>
{
new MyCustomClass{Name = "Josh", Age = 43},
new MyCustomClass{Name = "Bob", Age = 14},
new MyCustomClass{Name = "Ashley", Age = 32},
};

DynamicallyLoadUserControlGrid("~/GridViewTemplates/SimpleGrid.ascx", dataSource);
}

private void DynamicallyLoadUserControlGrid(String controlLocation, List<MyCustomClass> dataSource)
{
var ctrl = (CustomGridControl)LoadControl(controlLocation);
ctrl.DataSource = dataSource;
ctrl.DataBind();

GridViewPlaceHolder.Controls.Add(ctrl);
}

所以,你已经明白了。自定义模板化控件,无需尝试在代码中手动构建所有令人讨厌的麻烦。我将在另一个答案中发布完全手动的方法,但是一旦您看到它,我想您会同意这种方法是首选。

关于asp.net - 动态更改 GridView 项模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com