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上下文中的选择编写变体。