2012-11-08 108 views
-1

幾天前,我問了一個關於從一個類的表單中填充列表框的問題。它的工作原理很棒!不過,我現在想要對文本框或標籤進行相同的操作。從這個問題的答案是如下:將信息從一個類發送到一個文本框到一個表格

你在做什麼是創建窗體的新實例 - 我相信 你想在一個表中添加現有表單上的項目?

如果是這樣做。

與像列表框在窗體上創建一個功能:

public void addItemToListBox(string item) 
    { 
     listBox1.Items.Add(item); 
    } 

然後,在類(記得要添加使用System.Windows.Forms的 參考)

public void doStuff() 
    { 
//Change Form1 to whatever your form is called 
foreach (Form frm in Application.OpenForms) 
{ 
     if (frm.GetType() == typeof(Form1)) 
     { 
      Form1 frmTemp = (Form1)frm; 
      frmTemp.addItemToListBox("blah"); 

     } 
} 
    } 

這很好。現在我想對文本框做同樣的事情。我想知道如果有人能解釋,或者如果有人有這個鏈接?

我有一個表格和一個類。這個形式創建了這個類的一個新實例並且在這個類中啓動了一個方法,比如說一個數學方程4 + 4;我希望答案是「8」,然後在類中的方法中顯示在form1上的文本框或標籤中。

+1

這個答案很糟糕;它從一開始就只是可怕的設計...... – Servy

+0

是你想從你的課堂設置文本到TextBox嗎? –

+0

見http://stackoverflow.com/questions/13186046/add-item-to-list-in-a-class-in-c-sharp/13186131#13186131 –

回答

2

隨着您的編輯,您所描述的是一種模型,其中您的Form使用另一個類。正在使用的類應該不知道Form,它是控件,或者它的計算結果可能如何使用。

你的其他類不應該找到表單,它不應該調用任何形式的方法或字段,或任何東西。它應該做的僅僅是返回一個值:

public class OtherClass 
{ 
    public int Add(int first, int second) 
    { 
     return first + second; 
    } 
} 

然後形式可以做這樣的事情:

private void button1_Click(object sender, EventArgs e) 
{ 
    //create an instance of the other class 
    OtherClass other = new OtherClass(); 
    //call it's add method, and then use the result to set the textbox's text 
    textbox1.Text = other.Add(4, 4).ToString(); 
} 

另一類應該是負責做計算,創造的結果,但不根據這些結果更新用戶界面。所有用戶界面邏輯都應該包含在Form類中。

1

在Form1.cs將這個:

public void SetText(string text) 
{ 
    textBox1.Text = text; 
} 

而且在類文件:

frmTemp.SetText("XYZ"); 
1

通過所有打開的形式循環似乎是一個... ...新穎的方式來獲得有問題的表格。

取而代之,您應該保留對錶單的引用,直到您最終關閉表單並直接通過該表單訪問表單上的變量(如列表框和文本框)。

所以,在這裏你創建表單,這樣做

Form1 form1 = new Form1(); 

//打開對話框,或無論你是要和Form1中做

//當你需要訪問一個文本控件:

form1.textBox1.Text = "Some value"; // Assumes the control is called textBox1 

如果doStuff從模型發生(一類現實世界的行爲的一些方面是型號),你是FO淡化糟糕的設計模式。

模型應該不知道它們是如何呈現的。相反,在典型的WinForms應用程序中,父表單可能會保存變量form1。在較新類型的UI項目中,您會看到一個MVC或MVVM模式來分隔模型,視圖(表示形式)和控制器(流控制)。我們也可以使用WinForms跟蹤MVC模式,儘管我見過的許多/大多數WinForms應用程序都沒有這樣做。

+0

將控件(如文本框)公開爲表單通常也被認爲是糟糕的設計。不像使用openforms那麼糟糕,但仍然不好。另外請注意,這個其他班級可能或可能不適合參考表格。 (我們不太清楚這個答案。)另一個類可能會訂閱一個事件,表單應該訂閱一個事件,另一個類應該向表單返回一個值或者其他幾個可能的值選項。 – Servy

+0

@Servy:我在你的評論之後加入了我的回答。我同意,因爲這會導致意大利麪條代碼,但只是提供一個函數包裝來獲取/設置並不能解決設計問題,而只會增加一層相同的不良設計模式。正確的方法是使用MVC,限制訪問權限,以便模式的每個部分只能訪問完成工作所需的內容。 –

+0

是的,我同意你在你的編輯中添加的內容。到目前爲止,我主要只是自言自語說什麼不應該在各種提出的解決方案中完成,因爲OP沒有提供足夠的信息/背景來提供我認爲合適的解決方案。如果/當他這樣做,我會添加一個答案。毋庸置疑,它不會涉及形式上的獲取/設置方法,而不會公開暴露內部控制。 – Servy

0

如果您使用Visual Studio,則可以指定每個成員的可見性,例如, privatepublicprivate是默認的(如果我沒記錯的話)。

如果您更改爲public,那麼你可以做到以下幾點:

public void doStuff() 
{ 
//Change Form1 to whatever your form is called 
foreach (Form frm in Application.OpenForms) 
{ 
    if (frm is Form1) 
    { 
     var frmTemp = (Form1)frm; 
     frmTemp.listBox1.Items.Add("blah"); 
     frmTemp.textBox1.Text += "hello world"; 
    } 
} 
} 

編輯1
一個更好的辦法,是要告訴Form1中,它需要更新的東西,它是如何提出的數據與調用該方法的類無關。

private Form1 _FindForm() 
{ 
    //assuming you can use Linq 
    return Application.OpenForms.OfType<Form1>().Single(); 
} 

public void displaySomething() 
{ 
    var form = _FindForm(); 
    form.displaySomething(); 
} 

public class Form1 
{ 
    public void displaySomething() 
    { 
    //add an item to the list box 
    listBox1.Items.Add("foo"); 

    //and change the text somewhere 
    textBox1.Text += "bar"; 
    } 
} 

Form1上,現在負責改變它擁有的控制,而不是其他的 - 可能是 - 無關的類操縱它們。 這將所有的UI邏輯encapsulated保存到Form1中,並且所有業務邏輯都可以在別處保存。

+0

這是一個設計得非常糟糕的方法,使它更糟... – Servy

+0

'生成成員'就是我所想的,默認情況下它的設置爲true,因此默認情況下,表單的成員可以公開訪問。 –

+0

@Servy - 是的,這不是最好的設計,但它確實回答瞭如何將文本從表單外部設置爲文本框的問題。 –

相關問題