Вопрос делегата GridView в ASP.Net - PullRequest
0 голосов
/ 02 июля 2010

Допустим, у меня объявлен класс GridViewEx, который расширяет GridView. И внутри этого класса у меня объявлен делегат с именем GetDataPage. Так это выглядит так:

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
}

Это работает нормально и делает то, что я хочу. Но то, что я хотел бы сделать - это разметка для GridViewEx, возможность установить этот делегат, например, так:

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

Однако я получаю эту ошибку:

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

Я думаю, невозможно установить его с помощью разметки, но я просто удивился. Достаточно легко установить делегата в коде, но я просто пытался узнать что-то новое. Спасибо за любую помощь.

1 Ответ

1 голос
/ 09 июля 2010

Похоже, что вы действительно хотите сделать, это выставить событие.Добавьте:

public event GetDataPageDelegate GettingDataPage

Тогда в вашей разметке вы сможете сказать:

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

Путем «поднятия» события в вашем методе DataBind следующим образом:

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

Однако я бы следовал схеме событий и создал новый объект:

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

и изменил бы ваш делегат на

public delegate void GettingDataPageEventHandler(object sender, GettingDataPageEventArgs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...