2017-04-06 1 views
1

나는 내 연구를 수행하고이를 이해했다고 생각했지만 한 형식에서 다른 형식으로 데이터를 전달하려고 시도하면 프로그램에서 예외가 발생합니다. 대리자를 사용하여 한 함수를 다른 함수에서 호출하려고합니다. 내가 가진 코드는 다음과 같습니다. 부모 폼에서C# 대리자가 예외를 throw하는 중

: 자식 폼에서

private void viewListToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    frmDataView dataview = frmDataView.GetInstance(); 

    if (dataview.Visible) 
     dataview.BringToFront(); 
    else 
    { 
     dataview.GotoRecord += GotoRecord; 
     dataview.Show(); 
    } 
} 

private void GotoRecord(int index) 
{ 
    Current.record = index; 
    loadRecord(index); 
    setNavButtons(); 
} 

, 나는 다음과 같은 코드로 부모 폼에 GotoRecord를 호출하려고 해요 :

내가 코드를 실행할 때마다
public partial class frmDataView : Form 
{ 

    AdvancedList<ScoutingRecord> displayedData = new AdvancedList<ScoutingRecord>(Current.data); 

    // Set the form up so that only one instance will be available at a time. 
    private static frmDataView _instance; 
    public static frmDataView GetInstance() 
    { 
     if (_instance == null) 
      _instance = new frmDataView(); 
     return _instance; 
    } 

    public delegate void GotoRecordHandler(int index); 
    public GotoRecordHandler GotoRecord; 

    private void dgvMain_CellDoubleClick(object sender, DataGridViewCellEventArgs e) 
    { 
     int row = e.RowIndex; 

     int teamnumber = (int)dgvMain.Rows[row].Cells["TeamNumber"].Value; 
     int matchnumber = (int)dgvMain.Rows[row].Cells["MatchNumber"].Value; 

     ScoutingRecord sr = Current.data.FirstOrDefault(x => x.TeamNumber == teamnumber && x.MatchNumber == matchnumber); 
     //int index = Current.data.IndexOf(sr); 
     GotoRecord(Current.data.IndexOf(sr)); 
    } 

, 그것은 다음과 같은 예외가 발생합니다 :

GotoRecord가 null이었다을

나는 간단한 것을 놓치고있는 것처럼 느껴집니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까? 외젠으로

+1

'GotoRecord was null'이 실제 예외 메시지입니까? 그건 표준 메시지가 아니에요 ... – DavidG

+1

이벤트에 구내 구독자가없는 것 같습니다. Microsoft는 이벤트 처리기를 호출하는 표준 방법을 규정합니다. C# 6에는 더 좋은 해결 방법이 있습니다. 그냥 구글 깨끗한 이벤트 처리기 호출 - 존 Skeet 그것에 좋은 기사가 있습니다. –

+0

'frmDataView.GetInstance()'에 대한 호출이 Visible 속성이 true로 설정된 상태로 반환되면 처음에는 GotoRecord 이벤트가 할당되지 않고 null이됩니다. – David

답변

2

제안 : 이전 버전에

GotoRecord?.Invoke(Current.data.IndexOf(sr)); 

경우 또는

가 아닌 다른 스레드를 사용하여 :

if (GotoRecord != null) 
{ 
    GotoRecord(Current.data.IndexOf(sr)); 
} 

편집 : 호출 수정 실수를.

+1

나는 당신의 제안을 시도했고 그것이 잘 작동하지 않았기 때문에 좌절감을 느꼈다. 트로이 제안에 오류가 있었지만, 그건 내 문제가 아니 었습니다. 누구든지이 대답 int보고 미래에 대한 구문을합니다 : 'GotoRecord? .Invoke (Current.data.IndexOf (sr))' 그러나 근본적인 내 문제는 내가 전화를 여는 기능을 복제했다 그 아이 양식을 읽었고, 나는 잘못된 것을 가지고 일하고있었습니다. 그것에 대해 조금 어리 석었지만 이벤트 처리기로 작업하는 더 좋은 방법을 배웠으므로 효과가있었습니다. 고맙습니다 – Prdufresne

관련 문제