2013-05-15 167 views
0

我有一個窗口表格文本框,複選框,組合框和按鈕.I表格元素的屬性有另一個單獨的類哪些更新數據在使用一部開拓創新的值的數據庫WinForm元素。我想訪問這個類中表單元素的部分或全部特性的屬性(文本,選中等)。問題是 -訪問另一個類

1.如果我使用參數化函數調用然後參數列表變爲太大。 這是工作,但看起來非常凌亂,我不知道這是否是一個很好的編程方法。

2.我可以使用靜態變量但我必須創建一個單獨的函數來更新靜態變量的值。 就像在組合框中。指數的變化(但人們說,防止靜電。)

3.Also我不想使用實例對象的主窗體類的的話,我就必須創建原始的對象(這顯然是非常昂貴的資源) 所以我的問題是哪種技術使用好的編程方法的帳戶???或有更好的方法來做到這一點...

+0

http://stackoverflow.com/questions/4822980/how-to-access-a-form-control-for-another-form –

+0

你的意思是說,所有的文本框,組合框..沒有分組到一個'class'中(比如說有屬性代表它們的值)? – V4Vendetta

+0

它們被分組在1個類中...... – Rohit

回答

0

1)您可以將所有參數分組到一個類或結構中,並將其實例傳遞給更新GUI控件的函數。

2)不要使用靜態變量 - 你會使這個參數是全局的,這不是你想要做的。

3)如果你傳遞你不是在創造MyForm類的新實例,並在您的數據庫客戶端類使用它的參考:

// class with all data you want to use to update GUI controls 
class MyData 
{ 
    public string Text1 { get; set; } 
    public string Text2 { get; set; } 
    ... 
} 

// class which obtains data from a DB 
class DBClient 
{ 
    MyForm myForm; 

    DBClient(MyForm myForm) 
    { 
     this.myForm = myForm; // you're just passing a reference to MyForm here, you're not creating a new object 
    } 

    void UpdateFormControls() 
    { 
     MyData data = ...; // fill it with data obtained from from DB 
     myForm.UpdateControls(data); 
    } 
} 

// your custom form containing various controls 
class MyForm : Form 
{ 
    DBClient dbClient; 

    MyForm() 
    { 
     dbClient = new DBClient(this); 
    } 

    public void UpdateControls(MyData data) 
    { 
     if (InvokeRequired) 
     { 
     this.BeginInvoke((MethodInvoker) delegate { UpdateControls(data); }); 
     return; 
     } 

     control1.Text = data.Text1; 
     control2.Text = data.Text2; 
     ... 
    } 
} 

更妙的是,如果你將通過脫鉤DBClientMyForm使MyForm實現接口,然後在DBClient類中使用接口引用。

+0

但後來我不得不數據綁定或東西,以便值得到更新,只要somthing changes..like索引改變的組合框,文本框的textchanged ...我張貼這個問題,因爲我認爲會有一個更精確的方式來做它... – Rohit

+0

您可以使用Windows窗體數據綁定將控件的任何公共屬性綁定到任何數據源:http://msdn.microsoft.com/en-us/library/ef2xyb33.aspx –

+0

對於一個簡單的示例,請看看這個問題:http://stackoverflow.com/questions/115328/how-can-i-do-databinding-in-c –

0

也許創建class與所需的字段,更新它的值,並在表單和數據管理器之間傳遞它。您也可以將控件綁定到object,以便自動更新控件中的值。

+0

數據綁定是我認爲我會做我猜...但也許有人當這種情況到達每個人時可能會想出一些創新技術。 – Rohit

0

理想情況下,您應該創建一個包含需要更新到數據庫中的字段的類或結構。現在使用適當的值更新此類實例的成員,並將此實例作爲參數傳遞給負責更新數據庫的類。這是一個比長參數列表更清潔的解決方案。

+0

問題現在更新。對於後期更新,但無法使用實例..我有很多類從orignal winform類獲取值.. – Rohit

+0

您的建議似乎對我有效.. :) – Rohit

1
更好

您可以使用get; set;每個控制&的使用這些屬性來訪問另一個類的窗體數據公共屬性去。

public partial class MainClass : Form 
    { 
     public MainClass() 
     { 
      InitializeComponent(); 
     } 

     public string UserName 
     { 
      get { return textBox1.Text } 
      set { textBox1.Text = value; } 
     } 

     public bool IsChecked 
     { 
      get { return checkBox1.Checked; } 
      set { checkBox1.Checked = value; } 
     } 
    } 

    public class AnotherClass 
    { 
     public void MyFunc() 
     { 
      MainClass obj = new MainClass(); 
      obj.UserName = "SomeUser1"; 
      obj.IsChecked = true; 
     } 
    }