2010-07-02 4 views
0

Disons que j'ai une classe GridViewEx déclarée qui s'étend GridView. Et à l'intérieur de cette classe, j'ai un délégué déclaré GetDataPage. Donc, il ressemble à ceci:Question de délégué GridView dans ASP.Net

public class GridViewEx : GridView 
{ 
    public delegate object GetDataPageDelegate(int pageIndex, int pageSize, string sortExpression, 
     IList<FilterItem> filterItems); 

    [Browsable(true), Category("NewDynamic")] 
    [Description("Method used to fetch the data for this grid")] 
    public GetDataPageDelegate GetDataPage 
    { 
     get 
     { 
      return ViewState["pgv_getgriddata"] as GetDataPageDelegate; 
     } 
     set 
     { 
      ViewState["pgv_getgriddata"] = value; 
     } 
    } 

    // ... other parts of class omitted 
} 

Cela fonctionne bien et fait ce que je veux. Mais ce que je voudrais être en mesure de faire est dans le balisage pour le GridViewEx, être en mesure de définir ce délégué, comme ceci:

<div style="margin-top: 20px;"> 
    <custom:GridViewEx ID="gridView" runat="server" SkinID="GridViewEx" Width="40%" AllowSorting="true" 
     VirtualItemCount="-1" AllowPaging="true" GetDataPage="Helper.GetDataPage"> 
    </custom:GridViewEx> 
</div> 

Cependant, je reçois cette erreur:

Error 1 Cannot create an object of type 'GUI.Controls.GridViewEx+GetDataPageDelegate' from its string representation 'Helper.GetDataPage' for the 'GetDataPage' property. 

I suppose qu'il n'est pas possible de le définir via le balisage, mais je me demandais juste. Il est assez facile de définir le délégué dans le code, mais j'essayais juste d'apprendre quelque chose de nouveau. Merci pour toute aide.

+0

juste une question, mais ne l'objet que vous fournissez pour le délégué demandent des arguments dans son constructeur? Peut-être que quelque chose autour de cette zone cause votre problème. –

+0

Je ne pense pas que le constructeur l'affecterait. Je pense qu'il n'est probablement pas possible de définir un délégué avec un balisage, mais j'ai pensé que je demanderais ici juste pour être sûr :). – dcp

+0

Tout d'abord, il ne sert à rien d'utiliser viewstate si vous définissez sa valeur dans le balisage. Viewstate est utilisé si vous définissez dynamiquement des valeurs, comme les lier à partir d'une source de données. Où est ce que vous appelez GetDataPage? – Jeroen

Répondre

1

Il semble que ce que vous voulez vraiment faire est d'exposer un événement. Ajouter:

public event GetDataPageDelegate GettingDataPage 

Ensuite, dans votre balisage, vous serez en mesure de dire:

<custom:GridViewEx ID="gridView" runat="server" SkinID="GridViewEx" Width="40%" AllowSorting="true" 
    VirtualItemCount="-1" AllowPaging="true" OnGettingDataPage="Helper.GetDataPage"> 
</custom:GridViewEx> 

Par "élever" l'événement dans votre méthode DataBind en tant que tel:

if(GettingDataPage!=null) 
    GettingDataPage(pageIndex,pageSize,sortExpression,filterItems); 

Cependant, Je voudrais suivre le modèle des événements et créer un nouvel objet:

public class GettingDataPageEventArgs : EventArgs 
{ 
    public int PageIndex{get;set;} 
    public int PageSize{get;set;} 
    public string SortExpression{get;set;} 
    public IList<FilterItem> FilterList{get;set;} 
} 

et changer votre délégué à

public delegate void GettingDataPageEventHandler(object sender, GettingDataPageEventArgs);