Comment déléguer des méthodes courantes de la vue en grid telerik à appeler depuis une page parent depuis chaque page enfant?

J’utilise Telerik Gridview pour afficher une liste d’enregistrements et j’ai plus de 10 pages sur lesquelles j’utilise cette grid avec cette copie de code d’événements courants collée (avec quelques modifications mineures) sur toutes ces pages:

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

Ceci est ma seule page qui hérite de la page suivante:

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

Donc est-ce possible que je puisse placer tous ces événements dans cette page ParentPage et simplement appeler depuis chaque page enfant au lieu de polluer chaque page avec cet événement?

Remarque : Dans certaines de mes pages, cette méthode DisplayRecords peut contenir certains parameters, mais tous les événements ne sont que communs.

Peut-être pouvez-vous placer votre logique commune dans une classe abstraite avec une méthode (ou une propriété) qui renvoie une référence sur un GridView concret et hérite de cette classe. Ensuite, sur chaque page, il vous suffit de mettre en œuvre cette méthode.

Quelque chose comme ça:

 public abstract class ParentPage { public virtual void DisplayRecords() { var gridView = this.GetGridView(); gridView.DataSource = this.GetAllData(); gridView.DataBind(); } protected abstract DataTable GetAllData(); protected ssortingng GetSortOrder() { if (this.sortOrder != GridSortOrder.Assending) return ssortingng.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); } } } 

Vous pouvez également placer votre logique commune dans la classe de base avec des méthodes virtuelles dans lesquelles use argument permet d’obtenir GridView comme e.Item.OwnerTableView .

En le rendant virtuel, vous pourrez remplacer cette logique dans n’importe quelle classe de page.

Quelque chose comme ça:

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

Vous pouvez également utiliser un paramètre générique pour obtenir des valeurs de la firebase database.

Vous appliquez généralement de nombreux principes lorsque vous essayez de refactoriser le code. Actuellement, vous essayez de modifier votre code pour ne pas enfreindre le principe DRY (DRY = ne vous répétez pas).
Mais, il est possible que d’autres principes entrent en jeu que vous souhaitiez prendre en compte. Le principe de responsabilité unique suggérerait que chaque méthode ne fait qu’une chose sans ambiguïté.

Selon votre scénario, vous devez générer l’intégralité de GridView manière dynamic ou avec des colonnes personnalisées et une logique de configuration GridView personnalisée, ce qui coûtera plus cher que d’écrire ces événements dans chaque page.

De plus, tous les événements doivent être liés à «GridView» pour se déclencher correctement. Vous ne pouvez pas séparer ces événements en d’autres fichiers, sinon les événements ne se déclencheront pas.

Vous avez une autre possibilité d’utiliser les contrôles utilisateur ASP.Net mais vous devez à nouveau écrire une logique pour manipuler les colonnes personnalisées GridView logique de configuration GridView personnalisée. Encore une fois, ce qui rend plus cher. Donc, je ne recommanderai pas de le faire. Il est préférable de conserver les méthodes individuellement pour chaque page.