2015-12-21 14 views
13

Ben kayıtların listesini görüntülemek için Telerik Gridview kullanıyorum ve tüm bu sayfalarda hangi ı (bazı küçük değişikliklerle) yapıştırılan bu şu ortak etkinlikler kod kopyasıyla birlikte bu GRIDVIEW kullanıyorum fazla 10 sayfa var:Telerik ızgarası nasıl açılır? Her alt sayfadan ana sayfanın aranması için yaygın yöntemler kullanılır.

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() 
} 
o yüzden bu ParentPage sayfa tüm bu olayları yerleştirmek ve sadece her çocuğun pag gelen çağırabilir bu mümkündür

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

:

Bu aşağıdaki sayfadan devralır benim tek sayfası e her sayfamı bu olaylarla kirletmek yerine?

Not: yöntemler can bazı parametreleri içeren ancak tüm olaylar sadece ortak olan dinlenme benim sayfaların bazıları bu DisplayRecords içinde.

+1

Bu denetimi içeren bir ana sayfa oluşturamıyor musunuz?Bunu bir ana Sayfa sınıfı kullanarak da yapabilirsiniz, ancak kontrolü dinamik olarak "Init" olayındaki ana denetimine eklemeniz gerekecek, böylece yaşam döngüsü hala çalışıyor olacaktır. – Luizgrs

+0

@Luizgrs: Izgara tanımları nedeniyle ana sayfamda saklayamam. her sayfada farklıdır, bu yüzden nasıl devam edeceğimi ana sayfa çözümünün iyi olduğunu düşünmüyorum. –

+1

Ana sayfalar "zincirleme" olabilir, yani ana olanı kullanan bir ana sayfası olabilir ve sadece bu 10 sayfa bu ikinci ana sayfayı kullanacaktır – Luizgrs

cevap

4

Size mantıksal mantığı, GridView numaralı betona referans veren ve bu sınıftan devralan yöntem (veya özellik) yöntemiyle soyut sınıf içinde olabilirsiniz. Sonra her sayfada sadece bu yöntemi uygulamak zorunda. Böyle

şey:

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

Yoksa sanal yöntemlerle temel sınıf içindeki size genel mantığı koyabilirsiniz nereye e.Item.OwnerTableView gibi GridView almak için kullanılması olay args. sanal Böyle herhangi bir sayfa sınıfında

şey bu mantığı geçersiz kılmak mümkün olacak yaparak

:

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

Ayrıca db değerleri almak için jenerik parametresini kullanabilirsiniz.

+0

Birden fazla sayfam olduğu için tüm bu sayfalardaki kayıtları görüntülemek, kayıtları görüntülemek için farklı tablolara sahip olacaktır. DisplayRecords yöntemi? –

+1

@Her sayfadaki geçersiz kılma yöntemiyle GetGridView yöntemini kullanarak, mevcut sayfanın tablosunu her zaman alabilirsiniz ve onunla çalışabilirsiniz. Böylece, 'DisplayRecords' yönteminin her sayfasının genelini mantıksal sınıf sınıfına yerleştirebilir ve sayfa sınıfındaki 'DisplayRecords' geçersiz kılma sürümünü kullanarak özel mantık ekleyebilirsiniz. Çiftinizin 'DisplayRecords' yöntemlerini kodlayabilir ve örnek olarak göstermeye çalışabilir miyim? –

+0

Güncel güncellememi oku Bazı kodları ekledim –

2

Genelde kodu yeniden kodlamayı denerken uyguladığınız birçok ilke vardır. Şu anda kodunuzu DRY ilkesini ihlal etmeyecek şekilde yeniden düzenlemeye çalışıyorsunuz (DRY = kendinizi tekrar etmeyin).
Ancak, göz önünde bulundurmak isteyebileceğiniz diğer bazı prensipler gelebilir. single responsibility principle, her yöntemin yalnızca tek bir şey yapmasını öneriyordu.

Sizin senaryounuza göre, tüm sütunları özel olarak oluşturmak ve özel bir GridView yapılandırma mantığını tüm sayfalarda bu olayları yazmaktan daha pahalı olacak şekilde GridView dinamik veya çalışma zamanı oluşturmanız gerekir.

Ayrıca, tüm olayların doğru şekilde tetiklenmesi için 'GridView' öğesine bağlanması gerekir. Bu etkinlikleri başka dosyalara ayıramazsınız, aksi halde olaylar patlamaz.

ASP.Net kullanıcı denetimlerini kullanmanın başka bir seçeneğiniz vardır, ancak yine GridView özel sütunlarını ve özel GridView yapılandırma mantığını değiştirmek için mantık yazmanız gerekir. Yani tekrar daha pahalı hale getiriyor. Bu yüzden bunu tavsiye etmem. Her sayfa için yöntemleri ayrı ayrı tutmak daha iyidir.

İlgili konular