2016-12-01 3 views
0

Контекст: мне нужно создать 4 страницы, где мне нужно будет создать 2 таблицы для каждой страницы. Каждая таблица имеет одинаковую структуру, и единственное изменение - на загружаемые данные.Использование делегата с событиями

Я сделал что-то подобное для другой страницы, где мне приходилось делать 6 похожих таблиц на странице. Я использовал делегат для функций, которые дают разные данные, и передаю функцию, необходимую для моей функции TableInit. Это работает хорошо ! :)

Но теперь я собираюсь сделать статический класс, где я буду использовать всю свою функцию генератора таблиц, чтобы можно было ставить таблицы на странице с отдельными страницами без необходимости скопировать всю функцию.

Проблема в том, что у меня есть кнопка где-то в таблице и что я исправляю событие, расположенное на странице.aspx на этой кнопке. И когда я помещаю свою функцию в другой статический класс, я просто не могу найти способ передать свое событие.

Я вставляю здесь свой начальный код со всем на странице с этим вопросом: как вы изолируете функцию генератора таблиц со страницы?

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) 
    { 

    } 

ответ

1

Вы можете использовать базовое наследование с абстрактными функциями. Просто создайте базовую страницу для этих типов страниц.

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) {} 
... 
} 

Теперь вы можете поместить все общие вещи в базовом классе TablePage и поставить TablePage.cs в AppCode или в отдельном проекте.

+0

Это не то, о чем я думал вообще, но это тоже очень интересно, спасибо :) Я посмотрю на это :) –

Смежные вопросы