如何委托telerik网格视图从每个子页面的父页面调用常用方法?

我正在使用Telerik Gridview显示记录列表,我有超过10个页面 ,我正在使用此gridview以及以下常见事件代码复制粘贴(有一些小的更改)在所有这些页面上:

 protected void Page_Load(object sender, EventArgs e) { DisplayRecords() } public void DisplayRecords() { //Grid view names are different on different pages. GridView1.DataSource=Fetching records from database. GridView1.DataBind(); } protected void GridView1_SortCommand(object sender, GridSortCommandEventArgs e) { DisplayRecords() } protected void GridView1_PageIndexChanged(object sender, GridPageChangedEventArgs e) { var index = e.NewPageIndex; DisplayRecords() } protected void GridView1_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e) { var size = e.NewPageSize; DisplayRecords() } 

这是我的一页inheritance自以下页面:

 public partial class LoadSettings : ParentPage { //Load events and other events } [Serializable] public class ParentPage: RadAjaxPage { } Page 1:**ttt.aspx** public void DisplayRecords() { //Grid view names are different on different pages. GridView1.DataSource=this.GetAlltttData() GridView1.DataBind(); } public DataTable GetAlltttData() { using (var context = new MyDataContext()) { var data = from c in context.ttt select c; return MyDataContext.LINQToDataTable(data); } } Page 2:**bbb.aspx** public void DisplayRecords() { //Grid view names are different on different pages. GridView1.DataSource=this.GetAllbbbData() GridView1.DataBind(); } public DataTable GetAllbbbData() { using (var context = new MyDataContext()) { var data = from c in context.bbb select c; return MyDataContext.LINQToDataTable(data); } } protected void rgbbb_SortCommand(object sender, GridSortCommandEventArgs e) { DisplayRecords() } protected void rgbbb_PageIndexChanged(object sender, GridPageChangedEventArgs e) { var index = e.NewPageIndex; DisplayRecords() } protected void rgbbb_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e) { var size = e.NewPageSize; DisplayRecords() } 

那么这可能是我可以将所有这些事件放在这个ParentPage页面中,只是从每个子页面调用而不是用这个事件污染我的每一页?

注意 :在我的一些页面中,此DisplayRecords方法可以包含一些参数,但所有事件都很常见。

可能是你可以使用方法(或属性)将常用逻辑放在抽象类中,该方法在具体的GridView上返回引用并从该类inheritance。 然后在每个页面上,您只需要实现该方法。

像这样的东西:

 public abstract class ParentPage { public virtual void DisplayRecords() { var gridView = this.GetGridView(); gridView.DataSource = this.GetAllData(); gridView.DataBind(); } protected abstract DataTable GetAllData(); protected string GetSortOrder() { if (this.sortOrder != GridSortOrder.Assending) return string.Format("{0} DESC", this.sortExpression) return this.sortExpression; } protected void Page_Load(object sender, EventArgs e) { DisplayRecords(); } protected void GridView1_SortCommand(object sender, GridSortCommandEventArgs e) { if (!e.Item.OwnerTableView.SortExpressions.ContainsExpression(e.SortExpression)) { GridSortExpression sortExpr = new GridSortExpression(); sortExpr.FieldName = e.SortExpression; sortExpr.SortOrder = GridSortOrder.Ascending; e.Item.OwnerTableView.SortExpressions.AddSortExpression(sortExpr); } } protected void GridView1_PageIndexChanged(object sender, GridPageChangedEventArgs e) { e.Item.OwnerTableView.PageIndex = e.NewPageIndex; DisplayRecords(); } protected void GridView1_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e) { e.Item.OwnerTableView.PageSize = e.NewPageSize; DisplayRecords(); } } Page 1:**ttt.aspx** public class **tttPage : BasePage { protected override GridView GetGridView() { //return GridView of this page return GridView1; } protected override DataTable GetAllData() { using (var context = new MyDataContext()) { var data = c in context.ttt select c; return MyDataContext.LINQToDataTable(data); } } } Page 1:**bbb.aspx** public class **bbbPage : BasePage { protected override GridView GetGridView() { //return GridView of this page return GridView1; } protected override DataTable GetAllData() { using (var context = new MyDataContext()) { var data = c in context.bbb select c; return MyDataContext.LINQToDataTable(data); } } } 

或者您可以使用虚拟方法将基本类中的常用逻辑放在基类中,其中使用事件参数来获取GridViewe.Item.OwnerTableView

通过使其成为虚拟,您将能够在任何页面类中覆盖此逻辑

像这样的东西:

 public abstract class ParentPage { public virtual void DisplayRecords(GridView gridView) { gridView.DataSource = this.GetAllData(); gridView.DataBind(); } protected abstract DataTable GetAllData(); protected void Page_Load(object sender, EventArgs e) { DisplayRecords(e.Item.OwnerTableView); } protected void GridView_SortCommand(object sender, GridSortCommandEventArgs e) { DisplayRecords(e.Item.OwnerTableView); } protected void GridView_PageIndexChanged(object sender, GridPageChangedEventArgs e) { DisplayRecords(e.Item.OwnerTableView); } protected void GridView_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e) { DisplayRecords(e.Item.OwnerTableView); } } public class **tttPage : ParentPage { protected override DataTable GetAllData() { using (var context = new MyDataContext()) { var data = c in context.ttt select c; return MyDataContext.LINQToDataTable(data); } } } public class **bbbPage : ParentPage { protected override DataTable GetAllData() { using (var context = new MyDataContext()) { var data = c in context.bbb select c; return MyDataContext.LINQToDataTable(data); } } } 

您还可以使用generics参数从db获取值。

在尝试重构代码时,通常会应用许多原则。 目前,您正在尝试重构您的代码,以免违反DRY原则(DRY =不要重复自己)。
但是,其他一些校长可能会参与其中你可能想要考虑的事情。 单一责任原则表明每种方法只做一个明确的事情。

根据您的场景,您需要使用自定义列和自定义GridView配置逻辑动态或运行生成整个GridView ,这比在每个页面中编写这些事件更昂贵。

此外,所有事件必须与“GridView”绑定才能正确触发。 您无法将这些事件与其他文件分开,否则事件将不会触发。

您还有另一种使用ASP.Net用户控件的选项,但您需要编写逻辑来操作GridView自定义列和自定义GridView配置逻辑。 所以再次使它更昂贵。 所以我不建议这样做。 最好是为每个页面单独保留方法。