2011-03-12 5 views
0

작동하는 예제 코드가 있습니다.C#, 통과 이벤트가 작동하지 않습니다.

기본 양식 :

FileTransferManager fm = new FileTransferManager(); 

... 
public FrmMain() 
{ 
InitializeComponent(); 
... 
fm.OnFile += fm_OnFile; 
} 

... 
    void fm_OnFile(object sender, FileTransferEventArgs e) 
    { 
     var recvFile = new FrmReceiveFile(fm, e); 
     recvFile.Show(); 
     e.Accept = true; 
    } 

및 FrmReceiveFile : 여기

public partial class FrmReceiveFile : Form 
{ 
    private FileTransferManager fm; 
    private FileTransferEventArgs ftea; 
    public FrmReceiveFile(FileTransferManager ftm, FileTransferEventArgs fea) 
    { 
     InitializeComponent(); 

     fm = ftm; 
     ftea = fea; 

     Text = "File transfer: " + ftea.Jid; 

     lblSize.Text = Util.HumanReadableFileSize(ftea.FileSize); 
     lblFileName.Text = ftea.Filename; 
     lblDescription.Text = ftea.Description; 

     fm.OnError += fm_OnError; 
     fm.OnEnd += fm_OnEnd; 
     fm.OnStart += fm_OnStart; 
     fm.OnProgress += fm_OnProgress; 
    } 


    void fm_OnStart(object sender, FileTransferEventArgs e) 
    { 
     MessageBox.Show("file transfer started"); ///// THIS APPEARS & EVERYTHING WORKS! 
     if (e.Sid != ftea.Sid) 
      return; 
    } 
... 

그리고 하나 개의 형태로 내 코드, 모든이며, 아직 어떻게 든 작동하지 않습니다.

public partial class Form1 : Form 
    { 

     private string sid = ""; 

     FileTransferManager fmout = new FileTransferManager(); //// this FileTransferManager is for outgoing files 
     FileTransferManager fmin = new FileTransferManager(); //// this FileTransferManager is for incomeing files 
     FileTransferEventArgs fta = new FileTransferEventArgs(); 
     Jid _jid = new Jid(); 


     public Form1() 
     { 
      InitializeComponent(); 

      fmout.OnError += fmout_OnError; 
      fmout.OnEnd += fmout_OnEnd; 
      fmout.OnStart += fmout_OnStart; 
      fmout.OnProgress += fmout_OnProgress; 

      fmout.XmppClient = xmppClient; 
      fmin.XmppClient = xmppClient; 

      fmin.OnFile += fmin_OnFile; 
      fmin.OnEnd += fmin_OnEnd; 
      fmin.OnStart += fmin_OnStart; 
      fmin.OnProgress += fmin_OnProgress; 
     } 

     //////////////////////////////////////////////////////////////////////////////////////////// 

     void fmin_OnFile(object sender, FileTransferEventArgs e) 
     { 
      DisplayEvent("INCOMING FILE: " + e.Filename + " - " + e.FileSize); ///// THIS APPEARS CORRECTLY 
      e.Accept = true; 
      fta = e; 
     } 


     void fmin_OnStart(object sender, FileTransferEventArgs e) /// THIS WON'T START! :(
     { 
      MessageBox.Show("Incoming file!"); /// THIS WON'T START! :( 
      if (e.Sid != fta.Sid) 
       return; 
     } 

e.Accept = 진정한 같은데;이 실행되지 않습니다 fmin_OnStart ... 어떤 아이디어가 문제 일 수 있습니까?

감사합니다.

+2

모든 코드에도 불구하고 'e.Accept = true'가 무엇을해야하는지 알 수 없습니다. –

+0

첫 번째 코드 설정에서'ftea.Accept' 또는'recvFile.Show()'는'fm.Show()'를 트리거하고'fm.OnStart'를 트리거하고 이벤트 핸들러'fm_OnStart'를 실행한다고 추측 할 수 있습니다. –

+0

나는 무엇이 잘못되었는지 알아 본다. 두 개의 FileTransferManagers (들어오는/나가는)가있을 때 맘에 들지 않으므로 모두 하나로 묶어야합니다. – Roger

답변

1

두 코드에서 차이점은 (공유 한 코드에서 만들 수 있음) 첫 번째 코드에서 "OnFileHandler"가 "fm.OnStart + = fm_OnStart"이벤트를 등록하고 있다는 것입니다. 다른 하나 (작동하지 않는)에서 OnFileHandler가 호출되지 않아도 해당 작업을 수행하고 있습니다.

비록 FileTransferManager의 사용자로서, 나는 중요하다고 생각하지 않습니다.

여전히 두 번째 코드에서 똑같은 것을 시도 할 수 있습니다. 아래와 같이하십시오.

void fmin_OnFile(object sender, FileTransferEventArgs e)   
{  fmin.OnStart += fmin_OnStart; 
DisplayEvent("INCOMING FILE: " + e.Filename + " - " + e.FileSize); 
e.Accept = true;    fta = e; } 

그럴 경우 FileTransferManager 프로그래머에게 질문하게됩니다.

+0

시도했지만 작동하지 않았습니다. :/ – Roger

+0

내가 잘못 생각한 것을 찾았습니다. 두 개의 FileTransferManagers (들어오는/나가는)가있을 때 맘에 들지 않으므로 모두 하나로 묶어야합니다. – Roger

관련 문제