2013-02-12 65 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) 
} 

是否可以打電話了嗎? 讓我解釋我在做什麼。我想在行加載時調用彈出窗口,在彈出窗口中我有circlular進度條作爲gif動畫。我正在更改那些有效日期很快的項目的行背景。

+0

就是「另一個地方」同一個類定義中,還是沒有? – Servy 2013-02-12 19:13:26

+0

是什麼類的結構看起來就像是主叫/調用方法所在? – 2013-02-12 19:13:41

+1

這種方法看起來像一個事件處理程序 - 你將要附加到由該方法來處理事件。 – 2013-02-12 19:13:59

回答

3

有對事件處理程序,使它們未invokeable沒有任何限制。它們具有與任何其他方法組相同的可訪問性修飾符和調用規則。所以,你可以調用處理程序像任何其他方法,可選地傳遞參數與非空值:

AssortDatagrid_LoadRows(null, null);

UPDATE
收到您的留言後:

「調用線程不能訪問這個對象,因爲不同的 線程擁有它。「

這似乎是一個調用問題...實際上看起來是一個WPF調用。

Dispatcher.Invoke

在這種情況下,像...

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

雖然這應該可以解決的錯誤... Servy使一個很好的點。這種類型的工作從UI線程中卸載。推下去BackGroundWorker。我離題了...我們正在接近原始問題。

+0

它給了我這個錯誤調用線程不能訪問這個對象,因爲一個不同的線程擁有它。 – 2013-02-12 19:19:36

+0

@FirdavsKurbonov這是一個與問題無關的完全不同的問題,因爲您現在正在從'workForce_DoWork'方法調用'AssortDatagrid_LoadRows'。 – Servy 2013-02-12 19:21:35

+1

至於編輯,在上下文中,他幾乎可以肯定只是在BGW的另一個事件中完成工作,而不是DoWork事件,而不是使用「Invoke」。 – Servy 2013-02-12 19:24:35

0

可以調用事件處理程序等的任何其它方法,但更好的方法是重構代碼並提取事件處理程序的內容作爲一個通常的方法(用所需參數)。然後在兩個地方調用方法(事件處理程序和第二個要調用事件處理程序的地方)。

+0

'「你可以像調用任何其他方法一樣調用事件處理程序」'它們* *方法。作爲方法沒有比任何其他更特別的;他們只是碰巧有一個符合某個特定事件的簽名。這裏的想法是你將常規方法附加到事件上,而不是像方法那樣使用事件處理程序。 – Servy 2013-02-12 19:25:53

+0

@Servy是的,但通常你創建event-hadnlers只是爲了處理事件,並且你在其中編寫了一些代碼,然後你意識到你還需要從其他地方調用該方法。但是你方法的簽名使它不適合(或醜陋)手動調用它。 – 2013-02-12 19:30:10

+1

是的,我將這歸因於MS框架中個人事件的糟糕設計;當他們幾乎從來不合適時,他們使用他們所做的簽名令人非常惱火。在任何情況下,我發現這些參數很少被實際使用,所以傳遞'null'值通常是可以接受的,儘管我並不反對你建議的重新分解。通常,當我這樣做時,我完全跳過命名的事件處理程序,並將lambda用作事件處理程序,該處理程序調用具有實際使用的參數的真實方法。 – Servy 2013-02-12 19:34:48

相關問題