1

我有一个带有文本框、复选框、组合框按钮的窗口窗体。我有另一个单独的类,它使用原始 WinForm 元素的值更新数据库中的数据。我想访问部分或全部的属性(文本、选中等)此类中表单元素的字段。问题是-

1.如果我使用参数化函数调用,那么参数列表变得太大。eg-function(int a,bool c,string d,int e,int f,bool e,bool h,string g) 这是可行的,但看起来很不整洁,我不知道这是否是一种好的编程方法。

2.我可以使用静态变量,但我必须创建一个单独的函数来更新静态变量的值。就像组合框中的索引变化一样。(但人们说避免静态..)

3.另外我不想使用主表单类的实例对象,因为我将不得不在许多地方重复创建原始表单类的对象。(这显然非常耗费资源)..所以我的问题是哪种技术使用良好的编程方法???或者有更好的方法来做到这一点......

4

4 回答 4

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;
        }
    }
于 2013-05-15T10:31:09.680 回答
0

1) 您可以将所有参数分组到一个类或结构中,并将其实例传递给更新 GUI 控件的函数。

2)不要为此使用静态变量 - 你会使这个参数成为全局的,这不是你想要做的。

MyForm3)如果您在数据库客户端类中传递并使用它的引用,则您没有创建新的类实例:

// 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;
      ...
   }   
}

DBClient如果您将解耦并MyForm通过MyForm实现接口然后在DBClient类 中使用接口引用,那就更好了。

于 2013-05-15T09:28:55.333 回答
0

也许创建class所需的字段,更新它的值并在表单和数据管理器之间传递它。您还可以将控件绑定到,object以便控件中的值将自动更新。

于 2013-05-15T09:30:02.993 回答
0

理想情况下,您应该创建一个包含需要更新到数据库中的字段的类或结构。现在用适当的值更新这个类的实例的成员,并将这个实例作为参数传递给负责更新数据库的类。这是一个比长参数列表更简洁的解决方案。

于 2013-05-15T09:32:35.460 回答