我正在尝试使用委托在表单之间传递数据。我正在使用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();
}
}
答案 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)
以下是如何在两种表单之间进行通信的示例。
在此示例中,我有两个表单TrackBar
和TextBox
。当一个表单的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();
}
}
}