2012-02-09 92 views
2

我有一個表單,有很多設置頁面。所有頁面都是一樣的,所以我寧願只製作一個表單,然後傳遞它應該編輯的設置的名稱。我將如何做到這一點?可以說形式被稱爲「ConfigForm」,我希望能夠用的東西這樣稱呼它:在C#中使用其他變量字符串訪問變量? EVAL?

new ConfigForm("event1").Show(); 

簡單,這拉起ConfigForm,並將字符串「事件1」。但是,知道我正在查找「event1」設置,我現在如何訪問此設置?通常訪問的設置,我想我會用這樣的:(事件1是StringCollection)

string varName = Properties.Settings.Default.passedString[3]; 

我如何把「事件1」的字符串,當事件1存儲在變量「passedString」?在PHP中,我會使用EVAL之類的東西。我將如何在C#中完成它?

----編輯

以前的答案已經解決了 「設置」 的問題;但它並沒有回答潛在的問題。你如何使用在變量中傳遞的字符串作爲變量標識符?所以,如果我有一個名爲「passedString」字符串文本「事件1」存儲在它...我將如何得到這轉換:

this.(passedString).Text = "test"; 

this.event1.Text = "test"; 
+0

我猜WinForms? – 2012-02-09 04:45:08

+0

是的,Windows窗體。 – 2012-02-09 04:55:16

回答

1

Default繼承了具有以下特性:

Object this[ 
    string propertyName 
] { get; set; } 

所以,你可以使用[]。不要忘了將它轉換爲StringCollection類像下面

((StringCollection)Properties.Settings.Default[passedSetting])[3] 

如果你想更新StringColleciton,你可以得到一個參考,以這種方式:

StringCollection collection = (StringCollection)Properties.Settings.Default[passedSetting]; 
collection.Add("another value"); 
collection[3] = "replace"; 
Properties.Settings.Default[passedSetting] = collection; // We'd rather call the setter. 
+0

這就是我正在尋找的數據......我可以怎樣設置數據? – 2012-02-09 05:20:49

+0

在答案中查看我的更新 – evpo 2012-02-09 05:33:52

+0

這適用於設置......但我如何與其他表單項目一起執行此操作?例如,如果我想編輯「this。(passedSetting).Text」,該怎麼辦?沒有某種EVAL,這怎麼可能? – 2012-02-09 21:21:26

0

定義構造函數您希望參數傳遞給的形式。從SettingsBase

public class MyForm : Form 
{ 
    protected readonly string setting; 

    public MyForm(string setting) 
    { 
     this.setting = setting; 
    } 
} 


// to open 
(new MyForm("event1")).Show(); 
+0

你錯過了問題的後半部分。它可能看起來像'Properties.Settings.Default [setting] = someControl.Text'。 – 2012-02-09 04:59:33

+1

說實話,我甚至都不明白問題的後半部分。 – Matthew 2012-02-09 05:01:58

+0

這並不能回答我的問題......我需要訪問一個名爲「event1」的設置,而不需要在代碼中明確定義event1。 「event1」是在一個字符串中傳遞的。 – 2012-02-09 05:02:03

0

要獲得/設置的設置通過字符串鍵使用Settings.Default.this []索引器。

要獲得/設置窗體使用中的控件的屬性可以使用這個簡單的技術:

this.Controls["button1"].Text = "someText"; 

// or 
this.Controls.Find("button1", true).First().Text = "someText"; 

而且如果涉及到一種形式的任何財產或任何其他對象U可以使用自己的特殊或者最後reflection

但是避免在這種簡單的情況下使用反射。

+0

。第一()沒有工作...但[0]做.. 。 謝謝。 – 2012-02-10 07:22:11

+0

First()是LINQ擴展,因此您必須添加使用System.Linq來訪問此擴展(並且.NET> = 3.5) – 2012-02-10 07:27:35