我正在制作个人WinForms应用。在我的场景中说我有一个C#Form1
。 Form1
不断从Internet获取实时Exchange数据。现在,我点击Form1
上的按钮,然后Form2
即会打开。现在我需要Form1
上Form2
的一些值。
我在Form2
上有一个计时器,可以从Form1
收集数据,但是如何?
我曾尝试使用属性但无法执行此操作,因为它只会在我们初始化Form2时更新一次。
任何解决方案?
另外,如果不同时创建类的两个表单,如何将它的单个实例传递给它?
答案 0 :(得分:10)
答案 1 :(得分:2)
另一种可能的方法是创建一些接口来表示数据提供者和数据接收者的角色,然后在表单上实现这些接口。它与使用通用数据源非常相似,但不是通过对象运行,而是实现接口,数据可以直接到达需要的地方。通过数据源执行它可能会更有效率,虽然在不知道所有细节的情况下很难说,但如果你真的在传输大量数据,通过一个单独的数据源可能会花费你一些效率,特别是如果你从来没有需要一个地方的所有数据。
在这里的示例代码中,我展示了如果您为不同类型的数据实现自己的事件args会是什么样子,如果您希望能够在事件的公共数据源中使用它比什么时候发送的更具粒度。 (请记住,我已经在网页上输入了这一切而没有尝试编译它;这应该让你知道如何做到这一点,但它可能(我估计100%的变化),我没有'完美地完成所有事情。:D)
public class FirstDataKindEventArgs : EventArgs
{
public FirstDataKindEventArgs(int parID, string parName, string parOtherInfo)
{
Id = parId;
Name = parName;
OtherInfo = parOtherInfo;
}
public int ID { get; set; }
public string Name { get; set; }
public string OtherInfo { get; set; }
}
// plus other event arg definitions
public interface IExchangeDataProvider
{
event EventHandler<FirstDataKindEventArgs> FirstDataKindReceived;
event EventHandler<SecondDataKindEventArgs> SecondDataKindReceived;
event EventHandler<ThirdDataKindEventArgs> ThirdDataKindReceived;
}
public interface IExchangeDataReceiver
{
void ConnectDataProvider(IExchangeDataProvider Provider);
}
然后在您的数据提供表单中,您将实现界面:
public partial class MyProvidingForm : System.Windows.Forms.Form, IExchangeDataProvider
{
// normal form stuff
// ...
#region IExchangeDataProvider
public event EventHandler<FirstDataKindEventArgs> FirstDataKindReceived;
public event EventHandler<SecondDataKindEventArgs> SecondDataKindReceived;
public event EventHandler<ThirdDataKindEventArgs> ThirdDataKindReceived;
public void FireDataReceived(EventArgs Data)
{
FirstDataKindEventArgs FirstKindData = Data as FirstDataKindEventArgs;
if (FirstDataKindEventArgs != null)
if (FirstDataKindReceived != null)
FirstDataKindReceived(FirstKindData);
//... etc.
}
public void GotSomeDataOfTheFirstKind(int TheID, string SomeName, string Other)
{
FirstDataKindEventArgs eArgs =
new FirstDataKindEventArgs(TheId, SomeName, Other);
FireDataReceived(eArgs);
}
以及您希望接收数据的接收方表格或其他类别:
public partial class FirstDataKindReceivingForm :
System.Windows.Forms.Form,
IExchangeDataReceiver
{
// usual form stuff
// ...
private IExchangeDataProvider myDataProvider;
public void ConnectDataProvider(IExchangeDataProvider Provider)
{
myDataProvider = Provider;
myDataProvider.FirstDataKindReceived +=
new EventHandler<FirstDataKindEventArgs>(
HandleFirstKindOfDataReceived
);
}
private void HandleFirstKindOfDataRecieved (
object sender, FirstDataKindEventArgs
)
{
// do whatever with data
}
}
#endregion
}
等等。
答案 2 :(得分:1)
编辑Form2的构造函数,以便在运行带有.Show或.ShowDialog的新Form2时可以从Form1传递一些值
Form2 myForm = new Form2(value1,value2,value3 ...);
在Form2.cs上你应该将公共Form2()转换(或添加一个新的)公共Form2(var value1,var value 2 ...)
如果必须连续向Form2发送数据,则可以使用共享内存或共享数据文件。
答案 3 :(得分:-1)
Mahrous在db论坛中的答案似乎是最简单的http://www.daniweb.com/software-development/csharp/threads/126879/617436#post617436 其他一些解决方案也是有效的,可能适用,具体取决于应用程序的设计。