動態更改 GridView 項模板
我有一個相當大的 asp.net 網站,它在很多地方都使用綁定到同一個對象的 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); }所以你有它。自定義模板控制項,無需嘗試在程式碼中手動建構它們。我將在另一個答案中發布完全手動的方法,但是一旦你看到它,我想你會同意這種方法是首選的。