C# 如何委托telerik grid view从父页面调用每个子页面的常用方法?
我正在使用C# 如何委托telerik grid view从父页面调用每个子页面的常用方法?,c#,asp.net,gridview,delegates,telerik-grid,C#,Asp.net,Gridview,Delegates,Telerik Grid,我正在使用Telerik Gridview显示记录列表,并且我有超过10页使用此Gridview,并在所有这些页面上粘贴以下常见事件代码副本(有一些小改动): protected void Page_Load(object sender, EventArgs e) { DisplayRecords() } public void DisplayRecords() { //Grid view names are different on different pages.
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()
}
那么,我是否可以将所有这些事件放在这个父页面页面中,然后从每个子页面调用,而不是用这些事件污染我的每个页面
注意:在我的一些页面中,这个DisplayRecords方法可以包含一些参数,但其余的所有事件都是公共的。可能是,您可以将公共逻辑放在抽象类中,使用方法(或属性)返回对具体
GridView
的引用,并从该类继承。然后在每个页面上,您只需实现该方法
大概是这样的:
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);
}
}
}
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);
}
}
}
或者,您可以使用虚拟方法将公共逻辑放在基类中,其中使用事件参数获取GridView
,比如e.Item.OwnerTableView
通过使其虚拟化,您将能够在任何页面类中重写此逻辑
大概是这样的:
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);
}
}
}
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);
}
}
}
公共抽象类父页
{
公共虚拟void显示记录(GridView GridView)
{
gridView.DataSource=this.GetAllData();
gridView.DataBind();
}
受保护的抽象数据表GetAllData();
受保护的无效页面加载(对象发送方、事件参数e)
{
显示记录(如Item.OwnerTableView);
}
受保护的void GridView\u SortCommand(对象发送方、gridsortCommand和ventargs e)
{
显示记录(如Item.OwnerTableView);
}
受保护的无效GridView\u页面索引交换(对象发送方,GridPageChangedEventArgs e)
{
显示记录(如Item.OwnerTableView);
}
受保护的无效GridView\u PageSizeChanged(对象发送方,GridPageSizeChangedEventArgs e)
{
显示记录(如Item.OwnerTableView);
}
}
公共类**ttp页:父页
{
受保护的覆盖数据表GetAllData()
{
使用(var context=new MyDataContext())
{
var data=c在context.ttt中选择c;
返回MyDataContext.LINQToDataTable(数据);
}
}
}
公共类**bbb页:父页
{
受保护的覆盖数据表GetAllData()
{
使用(var context=new MyDataContext())
{
var data=c在context.bbb中选择c;
返回MyDataContext.LINQToDataTable(数据);
}
}
}
您还可以使用泛型参数从数据库中获取值。在尝试重构代码时,通常会应用许多原则。目前,您正在尝试重构代码,以避免违反原则(DRY=不要重复自己)。
但是,其他一些校长可能会来扮演你可能要考虑的问题。建议每个方法只做一件明确的事情。
根据您的场景,您需要动态生成整个
GridView
或使用自定义列和自定义GridView
配置逻辑生成运行时,这将比在每个页面中写入这些事件更昂贵此外,所有事件都必须绑定到“GridView”才能正确触发。您不能将这些事件与其他文件分开,否则不会触发事件
您可以使用
ASP.Net
用户控件的另一个选项,但同样需要编写逻辑来操作GridView
自定义列和自定义GridView
配置逻辑。所以再次使它更贵。所以我不建议这样做。最好为每个页面单独保留方法。您不能创建一个包含此控件的母版页吗?您也可以使用父页面类来执行此操作,但是您需要在Init
事件中将控件动态添加到其父控件中,以便其生命周期保持不变works@Luizgrs:我无法将其保留在母版页上,因为每个页面上的网格定义都不同,所以我将如何维护它,所以我不认为母版页解决方案是可行的很好。母版页可以“链接”,我的意思是你可以有另一个母版页使用主版页,只有这10页会用到第二个母版page@Luizgrs:你能发布任何描述这一点的解决方案吗?请这样做可以帮助我和其他人too@Luizgrs:您可以查看此问题上发布的asnwer吗?因为我有多个页面,所以在所有这些页面上显示记录将有不同的表来显示记录,所以我如何是否将在DisplayRecords方法中处理多个表?@Learning使用方法GetGridView
,该方法在每个页面上都被覆盖,您始终可以获取当前页面的表并使用它。因此,您可以在抽象类的DisplayRecords
方法中为每个页面添加常规逻辑,并使用page类中“DisplayRecords”的覆盖版本添加自定义逻辑。也许你们可以提供你们的“DisplayRecords”方法的代码,我将尝试在示例中展示它?请参阅我的更新问题,我已经添加了一些页面codes@Learning我已经更新了我的答案,现在,所有逻辑都与在单独的抽象方法中获取数据有关,您可以根据需要在每个页面上实现它。@学习我在示例中添加了变量,事件可以在其中设置所需的状态(页面大小、索引、排序表达式),此变量应在BaseClass
内部DisplayRecords
方法中使用,以创建结果项集。如果您可以为您的任何页面添加代码,我将展示如何一般地执行,或者如果您没有代码,我可以根据db上下文中的选择编写变体。