从另一个班级更新文本框

时间:2019-05-31 01:14:33

标签: c#

我需要从另一个类中写入Form1类的文本框,但无法使其正常工作。

我将使用一个非常简单的示例说明我要实现的目标。在Form1上,我有一个组合框,其中包含项1,2,3,4,5。还有一个文本框。根据组合框中选择的内容,文本框中将出现另一条消息。例如,如果我在组合框中选择1,则textbox1会说“已选择1”。如果我在组合框textbox1中选择2,则会说“已选择2”,等等。

我为此使用了switch语句,但是我不希望switch语句在Form1.cs中,而是在Class1.cs中。但是除非我在其中有switch语句,否则我无法将文本输入文本框Form1.cs。但是我真的希望switch语句在Class1.cs中。我已经尝试将我的文本框和组合框都设为公开,但这没什么区别。

这是Form1.cs中的内容:

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

    public string ComboBox1Text
    {
        get { return comboBox1.Text; }
    }

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

    private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
    {
        Class1 class1 = new Class1();
        class1.FunctionSelect();
    }
}

这是另一个类Class1.cs:

class Class1
{
    public void FunctionSelect()
    {
        Form1 form1 = new Form1();
        string switcher = form1.ComboBox1Text;
        switch (switcher)
        {
            case "1":
                form1.TextBox1Text = "1 was selected";
                break;
            case "2":
                form1.TextBox1Text = "2 was selected";
                break;
            case "3":
                form1.TextBox1Text = "3 was selected";
                break;
            case "4":
                form1.TextBox1Text = "4 was selected";
                break;
            case "5":
                form1.TextBox1Text = "5 was selected";
                break;
        }
    }
}

当我在组合框中选择某些内容时,文本框中没有任何反应。但是,如果我将FunctionSelect()中的switch语句从Class1.cs移到Form1.cs,它将完全按照我的预期工作。但是实际上我需要FunctionSelect()放在Class1.cs中-不在Form1.cs中。我认为问题是由于在Class1.cs中为Form1创建了一个新实例(Form1 form1 = new Form1()),这意味着我实际上并未写入显示在屏幕上的Form1。但是我不知道如何从Class1.cs写入Form1.cs上的文本框。

我确定我缺少一些非常简单的东西,但无法解决,也找不到符合我需要的帖子。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您的怀疑得到了充分的资金支持,您的问题恰恰是您正在制作新表格1,如何实现您要尝试的工作有多种方法,一种方法是将表格作为参数传递给另一个类,另一个可能是使用事件模式,您可以找到更多。

我将解释如何做第一个:

首先,您需要更新Class1以使其具有以Form1类作为参数的构造函数,然后将对该类的引用保存在class1中。然后,您可以使用该实例在Form1类上工作。请参阅上面的示例。

注意:根据经验,应该使用委托,在这种情况下,不需要委托就可以正常工作,但是在UI线程上修改值时,应该检查是否需要调用。可以改进的另一件事是,无需实例化多个class1,您可以拥有一个Class 1实例,并永久使用该实例,而不必创建多个class。

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

    public string ComboBox1Text
    {
        get { return comboBox1.Text; }
    }

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

    private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
    {
        Class1 class1 = new Class1(this);
        class1.FunctionSelect();
    }
}



public class Class1
{
    private Form1 _instance;

    public Class1(Form1 instance)
    {
        _instance = instance;
    }

    public void FunctionSelect()
    {
        string switcher = _instance.ComboBox1Text;
        switch (switcher)
        {
            case "1":
                _instance.TextBox1Text = "1 was selected";
                break;
            case "2":
                _instance.TextBox1Text = "2 was selected";
                break;
            case "3":
                _instance.TextBox1Text = "3 was selected";
                break;
            case "4":
                _instance.TextBox1Text = "4 was selected";
                break;
            case "5":
                _instance.TextBox1Text = "5 was selected";
                break;
        }
    }
}

答案 1 :(得分:0)

表单类不变:

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

     public string ComboBox1Text
     {
          get { return comboBox1.Text; }
     }

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

    private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
    {
          Class1 class1 = new Class1();
          class1.FunctionSelect();
    }

这是第二堂课

class Class1
{
public void FunctionSelect()
{
    Form1 form1 = (Form1)Application.OpenForms[0];

    string switcher = form1.ComboBox1Text;
    switch (switcher)
    {
        case "1":
            form1.TextBox1Text = "1 was selected";
            break;
        case "2":
            form1.TextBox1Text = "2 was selected";
            break;
        case "3":
            form1.TextBox1Text = "3 was selected";
            break;
        case "4":
            form1.TextBox1Text = "4 was selected";
            break;
        case "5":
            form1.TextBox1Text = "5 was selected";
            break;
      }
    }
 }

Application.OpenForms [index]是只读的“ FormCollection”,其中包含所有打开的表单,并且可以通过int或字符串(表单名称)进行索引,但是必须将其强制转换为表单类型,因为它的类型为“ Form” (您表单的基类)

示例:

 MyForm fm=(MyFormType)Application.OpenForm["MyFormName"]; // or 0 for example

https://docs.microsoft.com/en-US/dotnet/api/system.windows.forms.application.openforms?view=netframework-4.8