我知道这是非常基本的,但我找不到关于如何在MSDN,Google搜索和stackoverflow之间执行此操作的任何指南/教程。
我创建了一个新的Windows窗体应用程序,在这里我有Program和Form1,其中Form1拥有2个文本框和按钮。
Button1应该从Text1获取字符串并将其发送到program.cs,其中字符串被编辑并发送回Form1。然后Button2在Text2中显示新字符串。
我从Text1(使用Button1)获取字符串,但无法弄清楚如何将其发送到program.cs以便可以处理它。我应该做些什么来在两者之间传递数据?
我不确定这是否是正确的开始,但我创建了一个myForm,试图将字符串发送过来。但是我该如何发送回去?
在Program.cs中:
static Form1 myForm;
[STAThread]
static void Main()
{
string s1, s2;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
myForm = new Form1();
Application.Run(myForm);
s1 = myForm.sendOver();
}
答案 0 :(得分:4)
你实际上不能。 Application.Run(myForm);
将一直阻止,直到您的表单关闭,因此不再适合从中获取数据或向其提供数据。
在几乎所有的winform程序中,你都不应该修改program.cs。虽然你偶尔可以让它工作,但从设计的角度来看,它很少是可取的。
如果你想根据你的结果进行处理,你最有可能创建一个全新的类,与其中任何一个分开。在适当的时候调用该类中的方法(如果合适,创建它的实例)(这可能是在单击提交按钮时,在窗体关闭事件处理程序中等)。
答案 1 :(得分:2)
不久前,我回答了一个老问题,询问如何在两种不同形式之间传递数据。答案也适用于您的情况。选择一个符合您需求的产品。
1-(如果参数太多,不推荐)通过构造函数传递数据。
private void ShowForm(int a, string b, double c)
{
Form2 frm = new Form2(a, b, c);
frm.ShowDialog();
}
2-使用目标类的公共字段。 (不推荐)
private void ShowForm(int a, string b, double c)
{
Form2 frm = new Form2();
frm.intval = a;
frm.strval = b;
frm.doubleval = c;
frm.ShowDialog();
}
3-使用属性。
private void ShowForm(int a, string b, double c)
{
Form2 frm = new Form2();
frm.IntValue = a;
frm.StringValue = b;
frm.DoubleValue = c;
frm.ShowDialog();
}
4-使用标签。
private void ShowForm(int a, string b, double c)
{
Form2 frm = new Form2();
frm.SomeTextBox.Tag = a;
frm.SomeTextBox2.Tag = b;
frm.SomeTextBox3.Tag = c;
frm.ShowDialog();
}
5-使用代表。 (这个有点棘手)。
//in Form2
public delegate void PassValues(int a, string b, double c);
public PassValues passVals;
private void PassDataThroughDelegate(int a, string b, double c)
{
if(passVals != null)
passVals(a,b,c);
}
//in Form1
private void ShowForm(int a, string b, double c)
{
Form2 frm = new Form2();
frm.passVals = new Form2.PassValues(UseData);
frm.ShowDialog();
}
private void UseData(int a, string b, double c)
{
}
我个人最喜欢的是属性,代表和一些罕见的构造函数。
或者,您可以创建一个静态类,在其中放置一些属性,然后以其他形式使用它。 如果您的所有表单都需要共享某些信息,这非常有用。由于这不是在表单之间传递数据的方法,因此我没有在上面提到这种方法。
上面列出了在两个类(在本例中为表单)之间传递数据的方法。但是,在阅读了您的问题和您的意见后,我可以推荐这个:
像这样填写功能:
private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = ChangeString(textBox1.Text);
}
private string ChangeString(string str)
{
string result = "do some stuff to " + str;
return result;
}
此处ChangeString
功能基本上是您希望Program.cs
执行的操作。只需添加您的功能即可。如果您希望它做的更复杂,您可以创建一个类并将该功能添加到该类。
我认为你应该参加一些OO(面向对象)课程或阅读一些书籍。在实际操作之前,您应该熟悉OO的概念并计划您应该做的事情。此外,您应该阅读.Net和C#的内层,并了解程序的每个部分的目的是什么。我首先使用控制台应用程序,然后转到Winforms和其他UI原则。
那就是说,我应该快速说Program.cs
只是作为你的程序的入口点。您不应该尝试向该类添加逻辑,并尝试将每个类的实现保持为自身。尝试将每个班级可以做的事情分开,以避免复杂的设计。
我希望这可以帮助你开始。
答案 2 :(得分:-1)
static Form1 myForm;
[STAThread]
//we need a holder
//you can access static classes from your forms
public static class myCls {
public static string myStr;
static void myFunc(string str) {
myStr = str; //or whatever
}
}
static void Main()
{
//string s1, s2; //you don't need these
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
myForm = new Form1();
Application.Run(myForm);
//s1 = myForm.sendOver(); //you won't use this
}
你的form1必须包含:
//change your holder's content whereever you want
void Button1_Click() {
myCls.myFunc("string");
}
你的form2必须包含:
//then call your holder's content whereever you want
void Button1_Click() {
Text1.Text = myCls.myStr;
}