2013-02-12 2 views
0

다른 곳에서이 메서드를 호출하는 방법은 무엇입니까?C#에서이 메서드를 호출하는 방법?

private void AssortDatagrid_LoadRows(object sender, Microsoft.Windows.Controls.DataGridRowEventArgs e) 
{ 

    if (ValidTill.SelectedIndex >= 0) 
    { 
     DataRowView rowContext = e.Row.DataContext as DataRowView; 

     string item = rowContext.Row["Срок годности"].ToString(); 
     DateTime date; 
     if ((DateTime.TryParseExact(item, "dd'.'MM'.'yyyy", 
            CultureInfo.InvariantCulture, 
            DateTimeStyles.None, 
            out date)) && (rowContext != null)) 
     { 
      if (date.Date <= dt.Date) 
      { 
       try 
       { 

        e.Row.Background = new BrushConverter().ConvertFromString(rowColor) as SolidColorBrush; 

       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
        return; 
       } 
      } 
     } 
     else // когда не может парсировать дату 
     { 

     } 

    } 


} 

내가 여기를 호출 할 :

private void workForce_DoWork(object sender, DoWorkEventArgs e) 
{ 
    AssortDatagrid_LoadRows(object sender, Microsoft.Windows.Controls.DataGridRowEventArgs e) 
} 

그것을 호출 할 수 있습니까? 내가하는 일을 설명하겠습니다. 행이로드 될 때 팝업을 호출하고 팝업 내에서 GIF 애니메이션으로 진행률 표시 줄을 표시합니다. 유효한 날짜가 곧 나오는 항목의 행 배경을 변경하고 있습니다.

+0

"다른 장소"가 같은 클래스 정의에 있습니까? – Servy

+0

호출자/호출 메소드가있는 클래스 구조는 어떻게 생겼습니까? –

+1

그 메소드는 이벤트 핸들러처럼 보입니다. 메소드가 처리 할 이벤트를 첨부하고 싶을 것입니다. –

답변

3

이벤트 핸들러를 실행 취소 할 수있는 제한 사항이 없습니다. 다른 접근법 그룹과 동일한 액세스 가능성 수정 자와 호출 규칙이 있습니다. 그래서 당신은 선택적으로 null 이외의 값으로 인수를 전달, 다른 방법처럼 핸들러를 호출 할 수 있습니다

AssortDatagrid_LoadRows(null, null);

UPDATE
을 당신의 코멘트를받은 후 :

"호출 스레드가 없습니다 다른 스레드가이 객체를 소유하고 있기 때문에이 객체에 액세스하십시오. "

이것은 호출 문제로 보입니다 ... 실제로 WPF 호출 인 것으로 보입니다.

이이 오류를 해결해야하지만 ... Servy 우수한 점을 만든다 ...

this.Dispatcher.Invoke(new Action(()=>AssortDatagrid_LoadRows(null, null))

이 경우 뭔가 같은에서

Dispatcher.Invoke를 참조하십시오. 이러한 유형의 작업은 UI 스레드에서 오프로드해야합니다. 그것을 BackGroundWorker으로 푸시하십시오. 나는 ... 원래 질문에 접하게됩니다.

+0

그것은 나에게이 오류를 주었다. 다른 스레드가 그것을 소유하고 있기 때문에 호출하는 스레드는이 객체에 접근 할 수 없다. –

+0

@FirdavsKurbonov 'workForce_DoWork' 메소드에서'AssortDatagrid_LoadRows'를 호출하는 것과는 전혀 다른 문제입니다. – Servy

+1

편집에 관해서는 컨텍스트에서'Invoke '를 사용하는 대신 DoWork 이벤트 대신 BGW의 이벤트 중 다른 이벤트에서 작업해야합니다. – Servy

0

다른 방법과 같이 이벤트 처리기를 호출 할 수 있지만 더 나은 방법은 코드를 리팩터링하고 이벤트 처리기의 내용을 일반 매개 변수 (필수 매개 변수 포함)로 추출하는 것입니다. 그런 다음 두 곳에서 메서드를 호출하십시오 (이벤트 처리기 및 이벤트 처리기를 호출하려는 두 번째 위치).

+0

''다른 메소드와 같은 이벤트 핸들러를 호출 할 수 있습니다. ''글쎄, 그들은 * 메소드입니다. 다른 어떤 것보다 더 특별한 방법은 없습니다. 특정 이벤트와 일치하는 시그니처가있을뿐입니다. 여기서 아이디어는 메소드와 같은 이벤트 핸들러를 사용하지 않고 일반 메소드를 이벤트에 첨부한다는 것입니다. – Servy

+0

@Servy 예, 일반적으로 이벤트를 처리하기 위해 event-hadnlers를 작성하고 그 안에 코드를 작성한 다음 다른 곳에서 메소드를 호출해야한다는 것을 알고 있습니다. 하지만 당신은 방법의 서명을 부적절하게 (또는 못생긴) 수동으로 호출합니다. –

+1

예, 저는 MS 프레임 워크의 이벤트 디자인이 좋지 않은 것을 개인적으로 생각합니다. 사실상 결코 적절하지 않을 때 그들이하는 서명을 사용하는 것은 매우 귀찮습니다. 어쨌든, 논쟁은 실제로 거의 사용되지 않는다는 것을 알기 때문에, 당신이 제안한대로 다시 생각하기를 반대하지는 않지만'null '값을 전달하는 것은 일반적으로 받아 들일 수 있습니다. 일반적으로 나는 명명 된 이벤트 처리기를 건너 뛰고 실제로 사용되는 인수가있는 실제 메서드를 호출하는 이벤트 처리기로 람다를 사용합니다. – Servy

관련 문제