C# 用C语言在两个windows窗体之间进行通信#

C# 用C语言在两个windows窗体之间进行通信#,c#,winforms,properties,C#,Winforms,Properties,我有两种表格,一种是主表格,另一种是期权表格。例如,假设用户单击主窗体上的我的菜单:Tools->Options,这将导致显示我的选项窗体 我的问题是如何将选项表单中的数据发送回主表单?我知道我可以使用属性,但我有很多选择,这似乎是一件乏味而奇怪的事情 那么最好的方法是什么呢?属性是一个选项,共享静态类-另一个选项,事件-另一个选项…属性是一个选项,共享静态类-另一个选项,事件-另一个选项…在这种情况下,最好是使用一些可通过IServiceProvider访问的选项Service类/接口 只要在

我有两种表格,一种是主表格,另一种是期权表格。例如,假设用户单击主窗体上的我的菜单:
Tools->Options
,这将导致显示我的选项窗体

我的问题是如何将选项表单中的数据发送回主表单?我知道我可以使用属性,但我有很多选择,这似乎是一件乏味而奇怪的事情


那么最好的方法是什么呢?

属性是一个选项,共享静态类-另一个选项,事件-另一个选项…

属性是一个选项,共享静态类-另一个选项,事件-另一个选项…

在这种情况下,最好是使用一些可通过IServiceProvider访问的
选项Service
类/接口


只要在某些内容发生更改时添加一个事件,应用程序的其余部分就可以响应它。

在这种情况下,最好是使用一些可通过IServiceProvider访问的
选项Service
类/接口


只要在某些内容发生更改时添加一个事件,应用程序的其余部分就可以响应它。

您可以尝试。将选项保留在单独的类中,然后使用AutoMapper在类和表单之间传递数据。

您可以尝试。将选项保留在一个单独的类中,然后使用AutoMapper在类和窗体之间切换数据。

创建一个类,并将所有属性放入该类中。。在父类中创建一个属性,并从子类(选项)表单设置它

创建一个类并将所有属性放入该类中。。在父类中创建一个属性,并从子类(选项)表单中设置该属性

public SettingsResults GetNewSettings()
{
    if(this.ShowDialog() == DialogResult.Ok)
    {
         return new SettingsResult { ... };
    }
    else
    {
         return null;
    }
}
你可以这样称呼它:

...
using(var fb = new FormB())
{
    var s = fb.GetNewSettings();
    ...
    // Notify other parts of the application that settings have changed.
}
private void frm_Message(object sender, EventArgs e)
{
    Lbl.Text = ((Form2)sender).Message;
}
1    public delegate void dlFuncToBeImplemented(string signal);
2    public static event dlFuncToBeImplemented OnFuncToBeImplemented;
3    public static void FuncToBeImplemented(string signal)
4    {
5         OnFuncToBeImplemented(signal);
6    }
private void ObserverRegister()//will contain all observer function registration
{
    Observer.OnFuncToBeImplemented += Observer_OnFuncToBeImplemented;
    /*and more observer function registration............*/
}


void Observer_OnFuncToBeImplemented(string signal)//the function that will occur when  FuncToBeImplemented(signal) will call 
{
    MessageBox.Show("Signal "+signal+" received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

您可以使用如下形式的函数:

public SettingsResults GetNewSettings()
{
    if(this.ShowDialog() == DialogResult.Ok)
    {
         return new SettingsResult { ... };
    }
    else
    {
         return null;
    }
}
你可以这样称呼它:

...
using(var fb = new FormB())
{
    var s = fb.GetNewSettings();
    ...
    // Notify other parts of the application that settings have changed.
}
private void frm_Message(object sender, EventArgs e)
{
    Lbl.Text = ((Form2)sender).Message;
}
1    public delegate void dlFuncToBeImplemented(string signal);
2    public static event dlFuncToBeImplemented OnFuncToBeImplemented;
3    public static void FuncToBeImplemented(string signal)
4    {
5         OnFuncToBeImplemented(signal);
6    }
private void ObserverRegister()//will contain all observer function registration
{
    Observer.OnFuncToBeImplemented += Observer_OnFuncToBeImplemented;
    /*and more observer function registration............*/
}


void Observer_OnFuncToBeImplemented(string signal)//the function that will occur when  FuncToBeImplemented(signal) will call 
{
    MessageBox.Show("Signal "+signal+" received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

这可能有点回避了您的问题,但是我的设置对话框使用了应用程序设置结构

我找不到一个与我的做法类似的好例子(实际上有一个实际的类+对象),但这涵盖了另一种做法:


这可能有点回避了您的问题,但我的设置对话框使用了应用程序设置结构

我找不到一个与我的做法类似的好例子(实际上有一个实际的类+对象),但这涵盖了另一种做法:


表单是一个类,就像任何其他类一样。在表单类中添加一些公共变量,并在它们单击按钮关闭表单时设置它们(从技术上讲,它们只是隐藏它)

一个VB.NET的例子,但是你会明白的-

在选项窗体类中:

Public Option1 as String = ""
等。当他们点击“确定”按钮时进行设置

因此,在主窗体中,当他们点击“选项”按钮时,您可以创建选项窗体:

OptionsForm.ShowDialog()
退出时,您可以从表单上的公共变量获取选项设置:

option1 = OptionsForm.Option1

等等。

表单是一个类,就像任何其他类一样。在表单类中添加一些公共变量,并在它们单击按钮关闭表单时设置它们(从技术上讲,它们只是隐藏它)

一个VB.NET的例子,但是你会明白的-

在选项窗体类中:

Public Option1 as String = ""
等。当他们点击“确定”按钮时进行设置

因此,在主窗体中,当他们点击“选项”按钮时,您可以创建选项窗体:

OptionsForm.ShowDialog()
退出时,您可以从表单上的公共变量获取选项设置:

option1 = OptionsForm.Option1

等等。

Form1触发Form2打开。Form2具有重载构造函数,该构造函数将调用表单作为参数,并向Form2成员提供其引用。这就解决了通信问题。例如,我在Form1中将Label属性公开为public,而在Form2中对其进行了修改

通过这种方法,你可以用不同的方式进行交流

//您的表格1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2(this);
        frm.Show();
    }

    public string LabelText
    {
        get { return Lbl.Text; }
        set { Lbl.Text = value; }
    }
}
//你的表格2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private Form1 mainForm = null;
    public Form2(Form callingForm)
    {
        mainForm = callingForm as Form1; 
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.mainForm.LabelText = txtMessage.Text;
    }
}

(来源:)



(来源:)

Form1触发Form2打开。Form2具有重载构造函数,该构造函数将调用表单作为参数,并向Form2成员提供其引用。这就解决了通信问题。例如,我在Form1中将Label属性公开为public,而在Form2中对其进行了修改

通过这种方法,你可以用不同的方式进行交流

//您的表格1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2(this);
        frm.Show();
    }

    public string LabelText
    {
        get { return Lbl.Text; }
        set { Lbl.Text = value; }
    }
}
//你的表格2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private Form1 mainForm = null;
    public Form2(Form callingForm)
    {
        mainForm = callingForm as Form1; 
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.mainForm.LabelText = txtMessage.Text;
    }
}

(来源:)


(来源:)

MVC、MVP、MVVM——对于那些承认需要教程的人来说,这有点过分了。这些理论都有专门的课程

如前所述,传递对象可能是最简单的。如果将类视为对象(在这个意义上是可互换的)是新的,那么您可能需要再花2-4周的时间来确定属性和构造函数等等

无论如何,我都不是C#master,但如果您想在两种形式(也包括类/对象本身)之间传递值之外更进一步,这些概念需要非常具体。在这里,你根本不想显得刻薄,只是听起来你正在从VB6(或任何带有globals的语言)转向更结构化的语言

最终,它会点击

MVC、MVP、MVVM——对于那些承认需要教程的人来说,这有点过分了。这些理论都有专门的课程

如前所述,传递对象可能是最简单的。如果将类视为对象(在这个意义上是可互换的)是新的,那么您可能需要再花2-4周的时间来确定属性和构造函数等等

无论如何,我都不是C#master,但如果您想在两种形式(也包括类/对象本身)之间传递值之外更进一步,这些概念需要非常具体。我一点也不想在这里刻薄,只是