2016-07-23 5 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

'publicイベント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 event EventHandler<FirstPageEventArgs> FirstPageLoaded; 

EventHandlerのジェネリック版でイベント宣言でそれを

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

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

をし、含まれます:あなたのイベントハンドラが追加データを必要とする場合、あなたはEventArgsからクラスを派生することができますこの方法:

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"という名前の2つの要素(イベントとメソッド)があります。

PagePrev(); 

の場合は、何を呼び出す必要がありますか?私は、あなたはメソッドやイベントの名前を変更してから、うまく動作するはずです。

+0

デリゲートのPagePrevのdefinationを記述して、上記のPagePrevメソッドで記述された機能がlnkprevボタンのクリックで呼び出されるようにする方法 – Nida

+0

実際にデリゲートのPagePrevに機能を与える方法を見つけようとしています – Nida

関連する問題