【问题标题】:Accessing properties of Form elements in another class访问另一个类中表单元素的属性
【发布时间】:2013-05-09 19:21:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您的意思是说所有那些 TextBox、ComboBox .. 都没有分组到 class 中(比如说有代表其中值的属性)?
  • 他们只被归为一类......
  • 3) 您将传递对 Form 类的引用,而不是创建它的新实例。请查看我的更新答案。

标签: c# winforms


【解决方案1】:

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

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

3) 如果您在 DB 客户端类中传递并使用它的引用,那么您并没有创建 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;
      ...
   }   
}

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

【讨论】:

  • 但是然后我必须进行数据绑定或其他操作,以便在某些事情发生变化时更新这些值。例如组合框的索引更改,文本框的文本更改...我发布了这个问题,因为我认为会有一种更精确的方法......
  • 您可以使用 Windows 窗体数据绑定将控件的任何公共属性绑定到任何数据源:msdn.microsoft.com/en-us/library/ef2xyb33.aspx
  • 简单的例子请看这个问题:stackoverflow.com/questions/115328/…
【解决方案2】:

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

【讨论】:

  • 数据绑定是我想我会做的事情......但也许有人会想出一些创新技术,因为这种情况会出现在每个人身上。
【解决方案3】:

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

【讨论】:

  • 问题已更新..抱歉更新较晚,但无法使用实例..我有许多类从原始 winform 类中获取值..
  • 你的建议现在对我来说似乎很有效.. :)
【解决方案4】:

您可以更好地使用每个控件的公共属性 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;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2021-11-27
    相关资源
    最近更新 更多