我需要从另一个类中写入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上的文本框。
我确定我缺少一些非常简单的东西,但无法解决,也找不到符合我需要的帖子。任何帮助表示赞赏。
答案 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