如何委托 telerik 网格视图常用方法从每个子页面的父页面调用?
How to delegate telerik grid view common methods to be call from parent page from every child page?
我正在使用 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()
}
这是我继承自以下页面的一页:
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 方法可以包含一些参数,但其余所有事件都是通用的。
也许你可以将通用逻辑放在抽象 class 中,方法(或 属性)returns 在具体 GridView
上引用并继承自此 class。然后在每个页面上你只需要实现那个方法。
像这样:
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);
}
}
}
或者您可以使用虚拟方法将通用逻辑放入基 class 中,其中使用事件参数来获取 GridView
,例如 e.Item.OwnerTableView
。
通过将其设为虚拟,您将能够在任何页面中覆盖此逻辑 class
像这样:
public abstract class ParentPage<TEntity>
{
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);
}
}
}
您也可以使用通用参数从数据库中获取值。
在尝试重构代码时,您通常会应用许多原则。目前您正在尝试重构您的代码,以免违反 DRY 原则(DRY = 不要重复自己)。
但是,您可能会考虑其他一些校长。 single responsibility principle 表示每个方法只做一件明确的事情。
根据您的场景,您需要动态生成整个 GridView
或使用自定义列和自定义 GridView
配置逻辑运行时,这将比在每个页面中编写这些事件更昂贵。
此外,所有事件都必须绑定到 'GridView' 才能正确触发。您不能将这些事件分离到其他文件,否则事件将不会触发。
您还有另一种选择,即使用 ASP.Net
用户控件,但同样您需要编写逻辑来操作 GridView
自定义列和自定义 GridView
配置逻辑。所以又让它变得更贵了。所以我不建议这样做。最好为每个页面单独保留方法。
我正在使用 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()
}
这是我继承自以下页面的一页:
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 方法可以包含一些参数,但其余所有事件都是通用的。
也许你可以将通用逻辑放在抽象 class 中,方法(或 属性)returns 在具体 GridView
上引用并继承自此 class。然后在每个页面上你只需要实现那个方法。
像这样:
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);
}
}
}
或者您可以使用虚拟方法将通用逻辑放入基 class 中,其中使用事件参数来获取 GridView
,例如 e.Item.OwnerTableView
。
通过将其设为虚拟,您将能够在任何页面中覆盖此逻辑 class
像这样:
public abstract class ParentPage<TEntity>
{
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);
}
}
}
您也可以使用通用参数从数据库中获取值。
在尝试重构代码时,您通常会应用许多原则。目前您正在尝试重构您的代码,以免违反 DRY 原则(DRY = 不要重复自己)。
但是,您可能会考虑其他一些校长。 single responsibility principle 表示每个方法只做一件明确的事情。
根据您的场景,您需要动态生成整个 GridView
或使用自定义列和自定义 GridView
配置逻辑运行时,这将比在每个页面中编写这些事件更昂贵。
此外,所有事件都必须绑定到 'GridView' 才能正确触发。您不能将这些事件分离到其他文件,否则事件将不会触发。
您还有另一种选择,即使用 ASP.Net
用户控件,但同样您需要编写逻辑来操作 GridView
自定义列和自定义 GridView
配置逻辑。所以又让它变得更贵了。所以我不建议这样做。最好为每个页面单独保留方法。