2016-12-01 5 views
0

Kontext: Ich muss 4 Seiten erstellen, wo ich 2 Tabellen für jede Seite erstellen muss. Jede Tabelle hat die gleiche Struktur und die einzige Änderung betrifft die Daten, die geladen werden.Verwenden von Delegaten mit Ereignissen

Ich tat etwas ähnliches für eine andere Seite, wo ich 6 ähnliche Tabellen auf einer Seite machen musste. Ich habe Delegate auf Funktionen verwendet, die die verschiedenen Daten geben, und ich übergebe die Funktion, die für meine TableInit-Funktion benötigt wird. Es läuft gut ! :)

Aber jetzt denke ich darüber nach, eine statische Klasse zu machen, wo ich alle meine Tabellengeneratorfunktion in der Lage sein werde, Tabellen in mehrere Seiten zu legen, ohne die ganze Funktion kopieren zu müssen.

Das Problem ist, dass ich eine Schaltfläche irgendwo in der Tabelle habe und dass ich ein Ereignis in der page.aspx auf dieser Schaltfläche behoben. Und wenn ich meine Funktion in eine andere statische Klasse stelle, kann ich einfach keinen Weg finden, mein Ereignis zu bestehen.

Ich paste hier meinen ursprünglichen Code mit allem auf der Seite mit dieser Frage: Wie isolieren Sie die Tabellengeneratorfunktion von der Seite?

namespace Pointage 
{ 
public delegate List<M_FICHE> delOnGetRecent(M_USER_POINTAGE p_user); 
public partial class _Default : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     tableInit(this.recentFicheDataTableHead, this.recentFicheDataTableBody, M_FICHE.getFiveRecentUserFiche); 
     tableInit(this.recentFicheNeededCorrectDataTableHead, this.recentFicheNeededCorrectDataTableBody, M_FICHE.getFiveRecentUserFicheWithNeededCorrections); 
     tableInit(this.recentFicheNeedApprovalDataTableHead, this.recentFicheNeedApprovalDataTableBody, M_FICHE.getFiveRecentUserFicheWithNeededApproval); 
     tableInit(this.recentFicheNeededValidDataTableHead, this.recentFicheNeededValidDataTableBody, M_FICHE.getFiveRecentUserFicheWithNeededValidation); 
     tableInit(this.recentErrorFicheDataTableHead, this.recentErrorFicheDataTableBody, M_FICHE.getFiveRecentErrorFiche); 
     langInit(); 
    } 

    //procédure d'initialisation des différents label prenant compte de la langue 
    private void langInit() 
    { 
     // Useless for this problem 
    } 

    /// <summary> Table init. </summary> 
    /// 
    /// <remarks> G 0669144, 26/10/2016. </remarks> 
    /// 
    /// <param name="p_head">   The head. </param> 
    /// <param name="p_body">   The body. </param> 
    /// <param name="p_delOnGetRecent"> The delete on get recent method from M_FICHE. </param> 
    /// <param name="p_link">   The link. </param> 

    private void tableInit(HtmlGenericControl p_head, HtmlGenericControl p_body, delOnGetRecent p_delOnGetRecent) 
    { 
     List<M_FICHE> _listFiche = p_delOnGetRecent(new M_USER_POINTAGE(Convert.ToInt32(Session["id"]))); 
     if (_listFiche.Count == 0) 
     { 
      p_head.Controls.Clear(); 
      HtmlTableRow _row = new HtmlTableRow(); 
      HtmlTableCell _cell = new HtmlTableCell(); 
      _cell.InnerText = Resource.NO_RECENT_FICHE; 
      _row.Controls.Add(_cell); 
      p_head.Controls.Add(_row); 
     } 
     else 
     { 
      // HIDED CODE : creating thead code 
      p_body.Controls.Clear(); 
      foreach (M_FICHE fiche in _listFiche) 
      { 
       //Création de la ligne du tableau 
       HtmlTableRow _row = new HtmlTableRow(); 
       //Création de chaque cellules 
       HtmlTableCell cell = new HtmlTableCell(); 
       M_USER_POINTAGE _user = M_USER_POINTAGE.getUserFromSGID(fiche.USER_SGID); 
       cell.InnerText = String.Format("{0}. {1}", _user.NAME[0], _user.FIRSTNAME); 
       _row.Controls.Add(cell); 
       //Cellule data 
       HtmlTableCell cell2 = new HtmlTableCell(); 
       cell2.InnerText = fiche.DATE_CREATE.ToShortDateString(); 
       _row.Controls.Add(cell2); 
       //Cellule status 
       HtmlTableCell cell3 = new HtmlTableCell(); 
       cell3.InnerText = StatusManager.getRessource((STATUS)fiche.STATUT); 
       _row.Controls.Add(cell3); 
       //cellule action 
       HtmlTableCell cell4 = new HtmlTableCell(); 
       //Ajout du bouton 
       HtmlButton _button = new HtmlButton(); 
       _button.Attributes.Add("class", "btn btn-default"); 
       _button.InnerText = Resource.BTN_ACCESS_CARD; 
        // HERE IS THE PROBLEM 
       _button.ServerClick += _buttonAccess_ServerClick; 
       //bind on button 
       cell4.Controls.Add(_button); 
       _row.Controls.Add(cell4); 
       p_body.Controls.Add(_row); 
      } 
     } 
    } 

    private void _buttonAccess_ServerClick(object sender, EventArgs e) 
    { 

    } 

Antwort

1

Sie können grundlegende Vererbung mit abstrakten Funktionen verwenden. Erstellen Sie einfach eine Basisseite für diese Art von Seiten.

public abstract class TablePage : Page { 
    protected void tableInit(HtmlGenericControl p_head, HtmlGenericControl p_body, delOnGetRecent p_delOnGetRecent) { 
     ... 
     _button.ServerClick += actionEventHandler; 
     ... 
     } 
     ... 

    protected abstract void actionEventHandler(object sender, EventArgs e); 
} 

public class _Default : TablePage { ... 

protected override void actionEventHander(object sender, EventArgs e) {} 
... 
} 

Jetzt können Sie alle das gemeinsame Material in der TablePage Basisklasse setzen und die TablePage.cs in AppCode oder in einem separaten Projekt gesteckt.

+0

Das ist nicht, worüber ich überhaupt nachgedacht habe, aber das ist auch sehr interessant, danke :) Ich werde mir das ansehen :) –

Verwandte Themen