在form1.cs和program.cs之间传递数据

时间:2013-03-01 21:52:21

标签: c# winforms

我知道这是非常基本的,但我找不到关于如何在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();

}

3 个答案:

答案 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)
{
} 

我个人最喜欢的是属性,代表和一些罕见的构造函数。

或者,您可以创建一个静态类,在其中放置一些属性,然后以其他形式使用它。  如果您的所有表单都需要共享某些信息,这非常有用。由于这不是在表单之间传递数据的方法,因此我没有在上面提到这种方法。

更新

上面列出了在两个类(在本例中为表单)之间传递数据的方法。但是,在阅读了您的问题和您的意见后,我可以推荐这个:

对于这个特例:

  1. 在visual studio中打开表单设计器。
  2. 双击按钮1。 (这将为button1的click事件生成一个事件处理程序。)
  3. 像这样填写功能:

    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;
    }
    
  4. 此处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;
}