0

几天前,我问了一个关于在课堂上的表单上填充列表框的问题。它有效并且很棒!但是我现在想对文本框或标签做同样的事情。该问题的答案如下:

您正在做的是创建表单的新实例 - 我假设您正在尝试在现有表单的列表框中添加项目?

如果是这样,请这样做。

使用列表框在表单上创建一个函数,例如:

    public void addItemToListBox(string item)
    {
         listBox1.Items.Add(item);
    }

然后,在类中(记得添加 using System.Windows.Forms 引用)

   public void doStuff()
    {
 //Change Form1 to whatever your form is called
 foreach (Form frm in Application.OpenForms)
 {
      if (frm.GetType() == typeof(Form1))
      {
           Form1 frmTemp = (Form1)frm;
           frmTemp.addItemToListBox("blah");

      }
 }
    }

这很好用。现在我想对文本框做同样的事情。我想知道是否有人可以解释或是否有人对此有链接?

我有一个表格和一个班级。该表单创建了一个类的新实例并在该类中启动一个方法,例如数学方程式 4+4;我希望从类中的方法中将答案“8”显示在 form1 上的文本框或标签中。

4

4 回答 4

2

您通过编辑描述的是一个模型,其中您Form 使用了另一个类。正在使用的类应该不知道Form它的控件,或者它的计算结果如何可能被使用。

你的其他类不应该找到表单,它不应该调用表单的任何方法或字段,或者任何东西。它应该做的只是返回一个值:

public class OtherClass
{
    public int Add(int first, int second)
    {
        return first + second;
    }
}

然后表单可以执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
    //create an instance of the other class
    OtherClass other = new OtherClass();
    //call it's add method, and then use the result to set the textbox's text
    textbox1.Text = other.Add(4, 4).ToString(); 
}

另一个类应该负责进行计算,创建结果,但不根据这些结果更新用户界面。所有的用户界面逻辑都应该包含在Form类中。

于 2012-11-08T20:35:47.793 回答
2

把它放在 Form1.cs 中:

public void SetText(string text)
{
    textBox1.Text = text;
}

在类文件中:

frmTemp.SetText("XYZ");
于 2012-11-08T20:10:14.340 回答
1

循环遍历所有打开的表单似乎是一种……新颖的……获取相关表单的方法。

相反,您应该保留对表单的引用,直到最终关闭它,并直接通过它访问表单上的变量(如列表框和文本框)。

所以,在你创建表单的地方,做类似的事情

Form1 form1 = new Form1();

// 打开对话框或您要对 form1 执行的任何操作

// 当你需要访问一个文本控件时:

form1.textBox1.Text = "Some value"; // Assumes the control is called textBox1

如果doStuff是从一个模型(一个模拟现实世界行为的某些方面的类)中发生的,那么您正在遵循一个糟糕的设计模式。

模型不应该知道它们是如何呈现的。相反,在典型的 WinForms 应用程序中,父窗体可能会保存变量form1。在较新类型的 UI 项目中,您会看到 MVC 或 MVVM 模式来分离模型、视图(表示/表单)和控制器(流控制)。也可以使用 WinForms 遵循 MVC 模式,尽管我见过的许多/大多数 WinForms 应用程序都没有这样做。

于 2012-11-08T20:10:45.757 回答
0

如果您使用的是 Visual Studio,您可以指定每个成员的可见性,例如privatepublicprivate是默认值(如果我没记错的话)。

如果将其更改为public,则可以执行以下操作:

public void doStuff()
{
 //Change Form1 to whatever your form is called
 foreach (Form frm in Application.OpenForms)
 {
  if (frm is Form1)
  {
       var frmTemp = (Form1)frm;
       frmTemp.listBox1.Items.Add("blah");
       frmTemp.textBox1.Text += "hello world";
  }
 }
}

编辑 1
更好的方法是告诉 Form1 它需要更新一些东西,它如何呈现数据与调用该方法的类无关。

private Form1 _FindForm()
{
   //assuming you can use Linq
   return Application.OpenForms.OfType<Form1>().Single();
}

public void displaySomething()
{
   var form = _FindForm();
   form.displaySomething();
}

public class Form1
{
  public void displaySomething()
  {
    //add an item to the list box
    listBox1.Items.Add("foo");

    //and change the text somewhere
    textBox1.Text += "bar";
  }
}

Form1 现在负责更改它所拥有的控件,而不是其他(可能是不相关的)类来操作它们。这将所有 UI 逻辑保留在encapsulatedForm1 中,并且所有业务逻辑都可以保存在其他地方。

于 2012-11-08T20:12:30.410 回答