5

我知道这真的很基础,但我找不到任何关于如何在 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();

}
4

3 回答 3

4

你实际上不能。 Application.Run(myForm);将阻塞直到您的表单关闭,因此不再适合从中获取数据或向其提供数据。

在几乎所有 winform 程序中,您都不应该修改 program.cs。虽然你偶尔可以让它工作,但从设计的角度来看,它很少是可取的。

如果您想根据 from 的结果进行处理,您很可能应该创建一个全新的类,与其中任何一个分开。在适当的时候(这可能是单击提交按钮时,在表单关闭事件处理程序中等)调用该类的方法(如果合适,创建它的实例)。

于 2013-03-01T21:55:15.033 回答
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 的点击事件生成一个事件处理程序)。
  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;
    }
    

这里的ChangeString功能本质上是做你想做的Program.cs事。只需将您的功能添加到它。如果您希望它做的事情更复杂,您可以创建一个类并将功能添加到该类。

我给你的一般建议是:

我认为您应该参加一些 OO(面向对象)课程或阅读一些书籍。在实际执行之前,您应该熟悉 OO 的概念并计划您应该执行的操作。此外,您应该了解 .Net 和 C# 的内层,并了解程序每个部分的用途。我会先使用控制台应用程序,然后再使用 Winforms 和其他 UI 原则。

也就是说,我应该很快说,Program.cs它只是作为您的程序的入口点。您不应该尝试向该类添加逻辑并尝试将每个类的实现保留给它自己。尝试将每个类可以做的事情分开,以避免复杂的设计。

我希望这可以帮助您入门。

于 2013-03-01T22:25:42.787 回答
-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;
}
于 2013-03-01T22:09:09.287 回答