实现委托和事件引发模糊性错误
问题描述:
我在自定义控件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“的定义”
其实我没有从联机来源获取委托和事件的概念。我从未实施过它们。
请帮帮我!!!
答
的
委托定义一个函数签名。它可以被用作是定义的回调函数的类型:
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;
...
}
你在用什么事件? lnkprev_Click本身就是一个代表 –
只需删除'公共事件PagePrevHandler PagePrev;'你就可以工作(编译)代码。当你需要一个PagePrev事件时,问一个更集中的问题。 –