Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在form1.cs和program.cs之间传递数据_C#_Winforms - Fatal编程技术网

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

C# 在form1.cs和program.cs之间传递数据,c#,winforms,C#,Winforms,我知道这是非常基本的,但我找不到任何关于如何在MSDN、谷歌搜索和stackoverflow之间实现这一点的指南/教程 我创建了一个新的Windows窗体应用程序,这里有一个程序和Form1,其中Form1拥有两个文本框和按钮 Button1应该从Text1获取字符串并将其发送到program.cs,在program.cs中对字符串进行编辑并发送回Form1。然后按钮2在文本2中显示新字符串 我已经从Text1(使用Button1)中获取了字符串,但是我不知道如何将其发送到program.cs以

我知道这是非常基本的,但我找不到任何关于如何在MSDN、谷歌搜索和stackoverflow之间实现这一点的指南/教程

我创建了一个新的Windows窗体应用程序,这里有一个程序和Form1,其中Form1拥有两个文本框和按钮

Button1应该从Text1获取字符串并将其发送到program.cs,在program.cs中对字符串进行编辑并发送回Form1。然后按钮2在文本2中显示新字符串

我已经从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();

}

实际上你不能<代码>应用程序运行(myForm)将一直阻止,直到表单关闭,因此不再适合从表单中获取数据或向表单提供数据

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

如果您想基于from的结果进行处理,那么您很可能要创建一个全新的类,与这两个类中的任何一个都分离。在适当的时候(这可能是在单击提交按钮时,以关闭事件处理程序的形式,等等),从该类调用一个方法(如果适当的话,创建它的实例)

您的form1必须包含:

//change your holder's content whereever you want
void Button1_Click() {
    myCls.myFunc("string");
}
//then call your holder's content whereever you want
void Button1_Click() {
    Text1.Text = myCls.myStr;
}
您的form2必须包含:

//change your holder's content whereever you want
void Button1_Click() {
    myCls.myFunc("string");
}
//then call your holder's content whereever you want
void Button1_Click() {
    Text1.Text = myCls.myStr;
}

不久前,我回答了一个老问题,即如何在两种不同的表单之间传递数据。答案也适用于你的情况。挑一个适合你需要的

1-(如果参数太多,则不推荐)通过构造函数传递数据

 private void ShowForm(int a, string b, double c)
{
    Form2 frm = new Form2(a, b, c);
    frm.ShowDialog();
}
2-使用目标类的公共字段。(完全不推荐)

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-使用代表。(这个有点棘手)

我个人最喜欢的是属性、委托,在某些罕见的情况下还有构造函数

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

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

对于这种特殊情况:
  • 在visual studio中打开窗体设计器
  • 双击按钮1。(这将为button1的click事件生成一个事件处理程序)
  • 按如下方式填充函数:

    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
    函数实际上是在做您希望
    程序.cs
    做的事情。只需添加您的功能即可。如果您希望它执行更复杂的操作,那么可以创建一个类并将功能添加到该类中

    总体而言,我向您推荐: 我认为你应该学习一些面向对象的课程或者读一些书。在实际操作之前,您应该熟悉OO的概念并计划您应该做什么。此外,您还应该了解.Net和C#的内部层,并了解程序每个部分的用途。我会先使用控制台应用程序,然后再使用Winforms和其他UI原则

    这就是说,
    Program.cs
    只是作为程序的入口点。您不应该试图向该类添加逻辑,而试图将每个类的实现保持在自己的状态。尽量将每个类可以做的事情分开,以避免复杂的设计


    我希望这能帮助您开始。

    好吧,我想我误解了Program.cs的目的。所以它所做的只是运行表单。在这种情况下,我应该在
    InitializeComponent()之后处理Form1中的所有字符串吗?这取决于字符串的来源、处理的时间、处理结果的计划等。我们对此一无所知。您可能需要在加载表单、关闭表单、无需单击按钮或根据程序的具体情况选择任何其他选项时执行此处理。在我的场景中,用户在第一个文本框中输入字符串,然后按下更新按钮。然后数据进入程序,并通过去掉几个字符来改变字符串。然后,用户可以按下显示按钮,在文本框2中显示修改后的字符串。对于一个相当简单的过程,我希望所有这些都可以在Form1中完成。@krikara您想要的是类中的一个方法,它接受一个字符串并返回一个字符串。在按钮单击处理程序中,获取一个文本框的文本,在某个新类中将其作为参数传递给该方法,然后获取该方法的返回值并将其分配给第二个文本框的文本。该线程的处理现在可以在这个新类中完成,而不需要了解使用它的UI。这是一个你可以大量使用的模型,而且很容易做到。这看起来很有希望,但这是一个思想过程的完全死胡同<代码>应用程序运行(myForm)阻塞直到线程关闭,所以当你回到主方法时,你不能再与表单交互来“返回”任何东西。是的,我一直在尝试类似的东西,但是我不能把任何东西寄回Form1。我已经添加了一些explanation@user1942754我知道这个答案是通用的,但看到名字中有很多
    my
    字符串,我的眼睛就痛了。请尝试为代码选择有意义的名称,即使是出于教育目的。
    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;
    }