2015-12-21 5 views
13

私はレコードのリストを表示するためのTelerik Gridviewを使用していますが、私はこのすべてのページに(いくつかのマイナーな変更で)貼り付け、この次のような共通のイベントコードをコピーして、このGridViewコントロールを使用していますれている以上10ページありますtelerikグリッドビューの一般的なメソッドをすべての子ページから親ページから呼び出すように委譲するにはどうすればよいですか?

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() 
} 
をだから私はこのParentPageページにすべてのこのイベントを配置し、ちょうどすべての子PAGから呼び出すことができ、この可能です

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() 
     } 

は、これは以下のページから継承私の1ページです私のすべてのページをこのイベントで汚染するのではなく、e?

:私のページのいくつかでは、このDisplayRecords方法はいくつかのパラメータが含まれていますが、すべてのイベントがちょうど共通して休むことができます。

+1

このコントロールを含むマスターページを作成できませんか?親ページクラスを使用してそれを行うこともできますが、 'Init'イベントの親コントロールにコントロールを動的に追加する必要がありますので、ライフサイクルはまだ有効です。 – Luizgrs

+0

@Luizgrs:グリッド定義のためにマスターページに保持できませんすべてのページで異なるので、どのように私はそれを維持するので、私はマスターページソリューションが良いとは思わない。 –

+1

Masterpagesは "連鎖"することができます。メインページを使用するanoterのmasterpageを持つことができます。この10ページのみがこの2番目のマスターページを使用します。 – Luizgrs

答えて

4

コンクリート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); 
     } 
    } 
} 

それとも、e.Item.OwnerTableViewのようなGridViewを取得するためにイベント引数を使用する仮想メソッドで基本クラスの内部であなたに共通のロジックを置くことができます。

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); 
     } 
    } 
} 

また、あなたは、DBから値を取得するための一般的なパラメータを使用することができます。仮想あなたが任意のページクラスでは、このような

何かを、このロジックを上書きすることができますすることにより

+0

私は複数のページを持っているので、このページのレコードを表示すると、 DisplayRecordsメソッド? –

+1

すべてのページでオーバーライドされた 'GetGridView'メソッドを使用して@学習していると、常に現在のページのテーブルを取得してそのページで作業できます。したがって、抽象クラスの 'DisplayRecords'メソッドにすべてのページのロジックを配置し、ページクラスにオーバーライドバージョンの 'DisplayRecords'を使用してカスタムロジックを追加することができます。あなたの 'DisplayRecords'メソッドをカップルのコードを提供することができるかもしれないと私は例でそれを表示しようとしますか? –

+0

私の更新された質問を参照してください私はいくつかのページにコードを追加しました –

2

リファクタリングの際には、多くの原則が適用されます。現在、DRYの原則に違反しないようにあなたのコードをリファクタリングしようとしています(DRY =自分自身を繰り返さないでください)。
しかし、他のいくつかのプリンシパルがあなたが検討したいかもしれない遊びに来るかもしれません。 single responsibility principleは、各メソッドが曖昧でないことを1つだけ行うことを示唆します。

シナリオごとに、カスタム列とカスタムGridView構成ロジックを使用して動的にまたは実行時全体を生成する必要があります。これは、各ページにこれらのイベントを書き込むよりも高価になります。

また、すべてのイベントを適切にトリガーするには、 'GridView'に接続する必要があります。これらのイベントを別のファイルに分割することはできません。それ以外の場合、イベントは発生しません。

ASP.Netユーザコントロールを使用する別のオプションがありますが、GridViewカスタムカラムとカスタムGridViewコンフィグレーションロジックを操作するロジックを書き込む必要があります。だからもう一度もっと高価にしています。だから私はそうすることをお勧めしません。各ページごとに個別にメソッドを保持する方が良いです。

関連する問題