2013-05-15 123 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; 
     } 
    }