在表单c#delegate之间传递数据

时间:2017-05-21 12:48:45

标签: c# visual-studio delegates

我正在尝试使用委托在表单之间传递数据。我正在使用TrackBar,我想从trackBar向第二种形式发送值。问题是我想同时打开两个表单。当我打开第一个窗体并且滑块值更改时,然后显示Form2一切正常。但是,当我同时打开两种形式时,没有任何事情发生。 我会感激任何帮助:)

Program.cs

public class MultiFormContext : ApplicationContext
{
    private int openForms;
    public MultiFormContext(params Form[] forms)
    {
        openForms = forms.Length;
        foreach (var form in forms)
        {
            form.FormClosed += (s, args) =>
            {
                if (System.Threading.Interlocked.Decrement(ref openForms) == 0)
                    ExitThread();
            };
            form.Show();
        }
    }
}
static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MultiFormContext(new Form2(), new Form1()));



    }
}

Form1.cs

public delegate void delPassData(TrackBar trackVal);

public partial class Form1 : Form
{
    Form2 form2 = new Form2();
    public Form1()
    { 
       InitializeComponent();

    }
    private void trackBar1_Scroll(object sender, EventArgs e)
    {

         delPassData delegat = new delPassData(form2.someValFromTrackBar);

        //form2.Show();


        delegat(this.trackBar1);

    }
}

Form2.cs

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

    }

    public void someValFromTrackBar(TrackBar valFromTrackBar)
    {

        label1.Text = valFromTrackBar.Value.ToString();

    }

}

2 个答案:

答案 0 :(得分:2)

您的Form1创建了Form2的实例。此代码创建了Form2的另一个实例:

Application.Run(new MultiFormContext(new Form2(), new Form1()));

“出于某种原因”(正如孩子们所说),你没有包含适用版本的代码,但看起来非常像失败的情况,Form1订阅了一个跟踪栏错误的Form2实例上的事件。

必须只有Form2的一个实例,而Form1必须有对它的引用。仅使用Form2创建的Form1实例的最简单方法:

public partial class Form1 : Form
{
    Form2 form2 = new Form2();
    public Form2 Form2 { get { return form2; } }

...

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    var form1 = new Form1();

    Application.Run(new MultiFormContext(form1.Form2, form1));
}

S上。 Petrosov的答案也会起作用,但MultiFormContext不应该对这两种形式之间的关系细节有所了解,更不用说实施了。它也不能很好地做到这一点:如果你稍后添加第二个轨道栏,还有其他目的怎么办?这将是一团糟。 MultiFormContext是一个很好的干净的普通班,做得很好。我建议保持这种方式。

当然,

App也不应该承担这个责任,但至少在我的版本中不需要知道任何事情,但 是一种关系。

答案 1 :(得分:1)

以下是如何在两种表单之间进行通信的示例。 在此示例中,我有两个表单TrackBarTextBox。当一个表单的TrackBar滚动时,第二个TextBox得到文本“从Form1修改”或“从Form1修改”。

using System;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp6
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var form1 = new Form1();
            var form2 = new Form2();
            Application.Run(new MultiFormContext(form1, form2));
        }
    }
    public class MultiFormContext : ApplicationContext
    {
        private int openForms;
        public MultiFormContext(Form1 form1, Form2 form2)
        {
            form1.FormClosed += (s, args) =>
            {
                if (System.Threading.Interlocked.Decrement(ref openForms) == 0)
                    ExitThread();
            };
            form1.Controls.OfType<TrackBar>().First().Scroll += (sender, args) =>
            {
                form2.Controls.OfType<TextBox>().First().Text = "Modified from Form1";
            };
            form1.Show();

            form2.FormClosed += (s, args) =>
            {
                if (System.Threading.Interlocked.Decrement(ref openForms) == 0)
                    ExitThread();
            };
            form2.Controls.OfType<TrackBar>().First().Scroll += (sender, args) =>
            {
                form1.Controls.OfType<TextBox>().First().Text = "Modified from Form2";
            };
            form2.Show();
        }
    }
}