实现委托和事件引发模糊性错误

问题描述:

我在自定义控件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“的定义”

其实我没有从联机来源获取委托和事件的概念。我从未实施过它们。

请帮帮我!!!

+0

你在用什么事件? lnkprev_Click本身就是一个代表 –

+0

只需删除'公共事件PagePrevHandler PagePrev;'你就可以工作(编译)代码。当你需要一个PagePrev事件时,问一个更集中的问题。 –

委托定义一个函数签名。它可以被用作是定义的回调函数的类型:

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参数,其不包含任何数据。在事件声明

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

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

,包括它与普通版本的EventHandler:如果您的事件处理程序需要更多的数据,可以从EventArgs派生类

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

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

PagePrev(); 

?我认为,你应该重新命名方法或事件,然后everythink应该工作正常

+0

如何为委托PagePrev编写​​定义,以便在上面的PagePrev方法中编写的功能在lnkprev按钮的点击上调用 – Nida

+0

我实际上试图找出如何为委托PagePrev提供功能 – Nida