我正在创建一个应用程序,用户将单击form1上的按钮,这将导致form2显示。然后,用户将在form2上填写聊天,然后单击将关闭form2的按钮,并将参数发送回form1进行处理。我怎么能在C#中做到这一点?我见过人们使用属性来做这件事,但是这些例子还不够清楚。有人可以给出一些示例代码,告诉我如何传递参数吗?我更喜欢属性方法,但只要它有效,我会把它算作答案。
答案 0 :(得分:10)
简单地说,就像通常那样将表单元素放在第二种形式中。然后,您可以向该表单添加公共访问器,然后您可以从该表单中提取和引用。例如,如果Form2有一个你想撤回的文本字段,你可以:
class Form2
{
// Form2.designer.cs
private TextBox TextBox1;
// Form2.cs
public String TextBoxValue // retrieving a value from
{
get
{
return this.TextBox1.Text;
}
}
public Form2(String InitialTextBoxValue) // passing value to
{
IntiializeComponent();
this.TextBox1.Text = InitialTextBoxValue;
}
}
然后在创建表单时稍后访问它(就像OpenFileDialog为Filename等做的那样。
public void Button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2("Bob"); // Start with "Bob"
form2.ShowDialog(); // Dialog opens and user enters "John" and closes it
MessageBox.Show(form2.TextBoxValue); // now the value is "John"
}
同样的事情可以用于Int32,布尔等。只需要取决于表单的值,如果你想要转换/验证它,或者其他。
另外,您可以使用表单设计器中的Modifiers
属性,您可以将控件公开,以便可以从外部访问。我个人建议使用访问器,以便您可以验证并确认返回的结果,而不仅仅是转储值(因为这个逻辑通常在表单本身中找到,而不是在每个要调用/使用Form2的实例中)
答案 1 :(得分:4)
以下是我希望将参数传递给另一种形式的方式:
为Form1和Form2提供以下表单设计:
在此示例中,Form1上的“txtBoxForm1”文本框传递给Form2,在Form2中,它用于初始化Form2上的“txtBoxForm2”文本框。用户与Form2交互并通过单击[Return to Form1]按钮结束它后,'txtBoxForm2'文本框的值被分配给返回(通过引用)到Form1上'txtBoxForm1'文本框的参数。< / p>
编码只需两个简单的步骤:
步骤1)在Form1中,通过重载ShowDialog()方法将参数传递给Form2:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnSend_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
//Step 1)
//Display the form passing parameter(s) via overloading
//the ShowDialog() method.
//In this example the parameter is the 'txtBoxForm1' on Form1.
// f2.ShowDialog(); is replaced by
f2.ShowDialog(ref txtBoxForm1);
}
}
在上面的代码中,参数是通过引用传递的'txtBoxForm1'文本框本身。通过引用传递它是为什么它不仅将文本框值传递给Form2,而且还可以在Form1上接收并显示在执行Form2时应用于该文本框参数的任何修改。
我把整个Form1类放在这个类中,除了重载'f2.ShowDialog()'方法调用之外没有别的特别之处。
步骤2)通过重载的ShowDialog()方法接收和返回参数:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnReturn_Click(object sender, EventArgs e)
{
this.Close();
}
//Step 2)
//Receiving and returning parameter(s) via the overloaded ShowDialog() method.
//This saves the need to have Properties and or fields associated
//to parameters when overloading the above Form() constructor instead.
public void ShowDialog(ref TextBox txtBoxForm1)
{
//Assign received parameter(s) to local context
txtBoxForm2.Text = txtBoxForm1.Text;
this.ShowDialog(); //Display and activate this form (Form2)
//Return parameter(s)
txtBoxForm1.Text = txtBoxForm2.Text;
}
}
我再次提供了完整的表单类(在本例中为Form2)代码,以显示编码干预的有限程度。此处不需要额外的字段或属性。那是因为我在这里使用了'ShowDialog()'指令而不是Form1中的Form2()构造函数来传递参数。 与Form2()构造函数相反,ShowDialog()方法是围绕与Form2的用户交互阶段的包络。因此,它的定时允许'(ref txtBoxForm1)'参数是我们希望发送和接收的参数的完整和充分的代表。
通过使用不同的参数集(也称为签名)重新声明方法来重载方法,是C#.net的强大功能。在这种情况下,它允许一方面将参数添加到'ShowDialog()'方法的调用中,另一方面,重载方法从同一方法的原始版本中没有任何损失,因为原始版本的ShowDialog()。net框架方法也通过'this.ShowDialog();'执行。指令。
现在对我来说就是这个。
希望这有帮助!