2013-07-18 20 views
1

我得到了一個小問題,導致我出現了一些問題,我相信它並不難,但對我來說現在就是這樣。C#:主類和winforms類之間的通信。無法通過數據

我有兩個班,一個主班和我的winform班。

foreach (EA.Element theElement in myPackage.Elements) 
    { 
    foreach (EA.Attribute theAttribute in theElement.Attributes) 
    { 
    attribute = theAttribute.Name.ToString(); 
    value = theAttribute.Default.ToString(); 
    AddAttributeValue(attribute, value); 
    } 
    } 

這裏我得到的值,並嘗試將其寫入到一個Datagrid的,通過這種方法:

private void AddAttributeValue(string attribute, string value) 
    { 
     int n = dataGridView1.Rows.Add(); 
     dataGridView1.Rows[n].Cells[0].Value = attribute; 
     dataGridView1.Rows[n].Cells[1].Value = value; 
    } 

但是,編譯器告訴我,那AddAttributeValue是不是在目前情況下,我不能打電話它。我得到了我想要的值,但無法將它們傳遞給表單。我知道這聽起來微不足道,但我無法得到它。

+1

標準OOP的問題,您需要將表格對象的引用。並公開該方法。 –

+0

我在開始的時候公開過它,那不是問題,也不是解決方案,它肯定是不同的東西,但無論如何謝謝。 – Alika87

+0

明白了,謝謝:) – Alika87

回答

1

使「AddAttributeValue」市民:

public void AddAttributeValue(string attribute, string value) 

附錄:

按我下面的評論,這裏是你如何實現回調,讓你的主類中調用一個方法,你WinForm的時候它不以其他方式有一個實例成員是指:

你MainClass會是這個樣子:

public static class MainClass 
{ 
    public delegate void AddAttributeValueDelegate(string attribute, string value); 

    public static void DoStuff(AddAttributeValueDelegate callback) 
    { 
     //Your Code here, e.g. ... 

     string attribute = "", value = ""; 

     //foreach (EA.Element theElement in myPackage.Elements) 
     //{ 
     // foreach (EA.Attribute theAttribute in theElement.Attributes) 
     // { 
     //  attribute = theAttribute.Name.ToString(); 
     //  value = theAttribute.Default.ToString(); 
     //  AddAttributeValue(attribute, value); 
     // } 
     //} 
     // 
     // etc... 
     callback(attribute, value); 
    } 
} 

然後在WinForm的類,你會打電話像這樣的方法:

MainClass.DoStuff(this.AddAttributeValue); 

那將意味着,當「DoStuff」完成,稱爲「AddAttributeValue」的方法被調用。

+0

謝謝,但那不是解決辦法,我也在公開場合。問題是別的。 – Alika87

+1

再看看你的代碼,看起來你試圖在另一個類中調用一個實例成員,但是你沒有要引用的實例。您的代碼正在您的主類中尋找名爲「AddAttributeValue」的方法。你需要獲取你的winform的一個實例,並引用*它的'AddAttributeValue'實現,或者創建AddAttributeValue靜態並通過MyWinformClass.AddAttributeValue引用它。 (注意:如果你做了第二個,那麼訪問winform類的特定於實例的成員可能會遇到一些問題,比如你的'dataGridView1'成員)。 – Deleted

+0

我推薦的是將回調傳遞給你的主類。我會在一分鐘內提供另一個答案,證明這個想法在工作中。 – Deleted

1

如果我明白了,所提供的代碼片段有不同的類。

在這種情況下,該方法應該是公開的。

就像是:

public void AddAttributeValue(string attribute, string value) 
{ 
    int n = dataGridView1.Rows.Add(); 
    dataGridView1.Rows[n].Cells[0].Value = attribute; 
    dataGridView1.Rows[n].Cells[1].Value = value; 
}