实现委托和事件会引发歧义错误

时间:2016-07-23 07:14:57

标签: c# asp.net events c#-4.0 delegates

我在自定义控件lnkprev中添加了一个链接按钮。现在我创建了一个委托和一个事件。我想在lnkprev按钮的单击上调用它。我这样做是为了防止关闭调用自定义控件的页面部分。

    public delegate void PagePrevHandler();
    public event PagePrevHandler PagePrev;

    protected void lnkprev_Click(object sender, EventArgs e)
    {
        PagePrev();
    }

    public void PagePrev()
    {
        List<ListItem> pages = new List<ListItem>();
        int pageCount = TotalPages;
        int lastnumber = FirstNumber - 10;
        int nexttennumber = lastnumber + 10;

        if (lastnumber >= 0)
        {
            if (lastnumber == 0)
            {
                lastnumber = 1;
                nexttennumber = 11;
            }
            for (int i = lastnumber; i <= pageCount; i++)
            {
                if (i < nexttennumber && i > 0)
                {
                    pages.Add(new ListItem(i.ToString(), i.ToString(), i != PageIndex));
                }
            }
            FirstNumber = lastnumber;
            LastNumber = nexttennumber;
            rptPager.DataSource = pages;
            rptPager.DataBind();
        }
    }

现在的问题是它引发了歧义,说明了歧义问题。 “已经包含'PagePrev'的定义”

实际上,我没有从在线资源中获得代表和事件的概念。我从来没有实现它们。

请帮帮我!!!

2 个答案:

答案 0 :(得分:1)

你有两个带有“PagePrev”名称的元素 - 事件和方法。你写的时候应该叫什么:

PagePrev();

?我认为,你应该重命名方法或事件,然后每个思考都应该正常工作

答案 1 :(得分:1)

委托定义了一个函数签名。它可以按原样用于定义回调函数的类型:

public class MyPageClass
{
    public delegate void FirstPageCallback(string pageTitle);

    // Method with a callback function
    public void SomePageProcessing(FirstPageCallback fpcb, int pageNumber)
    {
        // Do some stuff
        ...

        // Call the function defined in another class
        fpcb("This is a title");
    }
}

然后可以在另一个类中声明具有适当签名的函数并将其传递给MyPageClass对象的方法:

public class MyClientClass
{
    private MyPageClass p = new MyPageClass();

    private void ProcessPages()
    {
        // Pass DoFirstPageStuff as callback function
        p.SomePageProcessing(DoFirstPageStuff, 7); 
    }    

    // This method has the signature specified by the FirstPageCallback delegate
    // It will be called inside p.SomePageProcessing
    private void DoFirstPageStuff(string title)
    {
        // Do something with the page title
        ...
    }
}

<小时/> EventHandler委托通常用于声明事件。您可以使用自己的代理,但可能没有必要。

public class MyPageClass
{
    public event EventHandler FirstPageLoaded;

    public void MorePageProcessing(int pageNumber)
    {
        // Do some stuff
        ...

        // Call all the registered event handlers
        if (FirstPageLoaded != null)
        {
            FirstPageLoaded(this, EventArgs.Empty);
        }
    }
}

包含MyPageClass实例的类可以注册事件处理程序:

public class MyClientClass
{
    private MyPageClass p = new MyPageClass();

    private void ProcessMorePages()
    {
        // Register ProcessLoadedPage as event handler
        p.FirstPageLoaded += ProcessLoadedPage; 
    }    

    // This method has the same signature as the EventHandler delegate
    // It will be called inside p.MorePageProcessing
    private void ProcessLoadedPage(object sender, EventArgs e)
    {
        ...
    }
}

<小时/> EventHandler委托有一个EventArgs参数,该参数不包含任何数据。如果您的事件处理程序需要其他数据,您可以从EventArgs派生一个类:

public class FirstPageEventArgs: EventArgs
{
    public int PageNumber;
    public string Title;

    public FirstPageEventArgs(int pageNumber, string title)
    {
        PageNumber = pageNumber;
        Title = title;
    }
}

并将其包含在事件声明中,其通用版本为EventHandler

public event EventHandler<FirstPageEventArgs> FirstPageLoaded;

事件处理程序将以这种方式触发:

    if (FirstPageLoaded != null)
    {
        FirstPageLoaded(this, new FirstPageEventArgs(currentPageNumber, "My title"));
    }

并使用适当的参数定义:

private void ProcessLoadedPage(object sender, FirstPageEventArgs e)
{
    // Use the values of the derived EventArgs argument
    int pageNumber = e.PageNumber;
    string title = e.Title;
    ...
}