2010-01-12 83 views
0

我試圖從另一個包含另一個類的文件(nodes.cs)中更改我的主窗體中的列表框。我在我的主窗體中創建了一個類,它爲我改變了文本框,所以我需要做的就是將字符串傳遞給它。不幸的是,除非讓String-changing-class靜態,否則我不能訪問其他類的函數。如果我使它靜態,我不能更改列表框,但不會出現錯誤: 非靜態字段,方法或屬性需要對象引用...試圖如何從其他類調用函數而不使其變爲靜態

我知道這意味着我需要創建該對象或使其非靜態。我發現整個班級的事情相當混亂。我必須啓動一個全新的表單對象來訪問它?無論如何。

我如何去從另一個類訪問列表框,包含在另一個文件?這兩個類位於相同的命名空間中。

有一個在加入什麼,我沒有真正的點,這是一個巨大的代碼量,並抹去我的一切,我已經嘗試過...

MAIN.CS 
    namespace neuralnetwork 
{ 
    public partial class mainform : Form 
    { 
yada yada 
public static void changetext(string text) 
{ 
listbox1.items.add(text); 
} 
    } 
    } 

Secondary.cs

namespace neuralnetwork 
    { 
    class lolercopter 
    { 
    public static void dolol() 
    { 
    //here is where I want to change the mainforms textbox. 
mainform.changetext(s); 
    } 
    } 
    } 

這實質上就是我所擁有的。我一直在讀超過這個一小時。

+0

請從你所擁有的添加一些代碼示例現在 – curtisk 2010-01-12 15:04:18

+0

您需要在MainForm中的實例的引用,放在您做了什麼樣: 的MainForm F =新的MainForm(); 這是你可以使用它的實例成員,如你的方法。 f.changetext(「something」);等等...... – 2010-01-12 15:13:42

+0

對,理查德。我明白這一點,我寫了這個。但是,如果我在輔助類中執行mainform f = new mainform(),不僅不能訪問列表框(Visual Studio不會列出它作爲選項),但是這不會創建一個完整的新表單嗎?沒有參考? – cam 2010-01-12 15:18:38

回答

1

你可以傳遞一個參考的MainForm到你的方法:

public static void dolol(mainform frm) 
{ 
    frm.changetext(s); 
} 

你的問題使我懷疑你有一些嚴重的體系結構問題與此應用程序,但希望這個解決方案可以爲你工作。

+0

老實說,我有點囉嗦......我可以發誓我曾以不同的方式嘗試了這麼多次。感謝所有人。你們真棒:)(第一次在StackOverflow) 現在我只需要弄清楚如何在啓動一個新的線程時傳遞參數;) – cam 2010-01-12 15:26:02

+0

也被稱爲通過該方法的依賴注入。 – 2010-01-12 15:47:23

1

類是像藍圖。

你問什麼是喜歡問如何打開車門下來的藍圖大廳。

這聽起來像你想一種形式的行動觸發另一種形式的行動或改變的狀態。這可以通過將狀態存儲在數據庫或內存中來實現,但最好通過引用實例化的主表單來實現。

1

如何您nodes類創建?它是由表單創建的嗎?如果是這樣,您可以在創建節點類時傳入對錶單的引用。

例如,假設您在表單中的回調中包含此代碼。

var nodes = new Nodes(); 
    nodes.UpdateSomething(args); 

您可以更改Nodes類的構造函數,以便它接受對form的引用。這就是所謂的依賴注入,特別是構造注入。您的課堂對錶格有依賴性,您在創建課程時提供表格。然後

var nodes = new Nodes(this); // "this" is a reference to the form 
nodes.UpdateSomething(args); 

你的節點類將使用助手爲:

public class Nodes 
{ 
    private Form TheForm { get; set; } 

    public Nodes(Form form) 
    { 
      this.TheForm = form; 
    } 

    public void UpdateSomething(EventArgs args) 
    { 
     ... 
     this.Form.ChangeText(newValue); 
     ... 
    } 
} 

的基本思路是,以提供一流的,它通過構造需要訪問的資源,所以你不必做使用長壽命的對象引用和靜態類。

編輯:我已經更新這反映您的代碼示例。請注意,您不是在表單中提供新類來更改列表框,而是提供一種方法。

相關問題