2016-07-23 60 views
0

我在自定義控件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事件時,問一個更集中的問題。 –

回答

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參數,其不包含任何數據。在事件聲明

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

你有兩個元素「PagePrev」的名稱 - 事件和方法。什麼應該叫,當你寫:

PagePrev(); 

?我認爲,你應該重新命名方法或事件,然後everythink應該工作正常

+0

如何爲委託PagePrev編寫​​定義,以便在上面的PagePrev方法中編寫的功能在lnkprev按鈕的點擊上調用 – Nida

+0

我實際上試圖找出如何爲委託PagePrev提供功能 – Nida