我在一个单独的类中定义了一个公共委托及其静态成员(返回对象类型),并试图从不同的winforms中调用它。然后,这些winform将检查委托成员返回的类型,然后对其进行适当的转换。到目前为止,一切都很好。但是,Visual Studio抱怨每个Winform中声明的委托类型从未分配给它,其值始终为null。
警告是:
警告CS0649字段'AccountReplenish.transferDelegate'从未分配,并且AccountReplenish.cs中的默认值始终为空ETTA
此外,在AccountReplenish中,如何调用委托类的GetData()?这是我的代码:
namespace ETTA.Classes
{
public class DelegateClass
{
public delegate void TransferObject(object data);
public TransferObject transferDelegate;
private static object _receivedOutput = new object();
public DelegateClass()
{
this.transferDelegate += new ETTA.Classes.DelegateClass.TransferObject(ReceiveOutput);
}
public static void ReceiveOutput(object data)
{
_receivedOutput = data;
}
public static object GetData()
{
return _receivedOutput;
}
}
}
而且我的每个winform都将按以下方式调用它:
public partial class WinForm1: Form
{
private ETTA.Classes.DelegateClass.TransferObject transferDelegate;
private object _receivedOutput = new object();
public WinForm()
{
this.transferDelegate += new Classes.DelegateClass.TransferObject(ETTA.Classes.DelegateClass.ReceiveOutput);
}
private void button_click(object sender, EventArgs e)
{
AutoReplenishWindow _progressWindow = new AutoReplenishWindow(transferDelegate);
DialogResult dr = _progressWindow.ShowDialog(this);
if (dr == System.Windows.Forms.DialogResult.OK )
transferDelegate.GetData(); // is this correct? Intellisense doesn't show GetData() in its list
if (this._receivedOutput != null && (this._receivedOutput.GetType() == typeof(string)))
{
string _s = (string)this._receivedOutput;
MessageBox.Show("Result: " + _s);
}
}
}
public partial class AutoReplenishWindow : Form
{
ETTA.Classes.DelegateClass.TransferObject transferDelegate;
public AutoReplenishWindow()
{
InitializeComponent();
}
public AutoReplenishWindow(ETTA.Classes.DelegateClass.TransferObject del)
{
InitializeComponent();
transferDelegate = del;
}
private async void AutoReplenishWindow_Shown(object sender, EventArgs e)
{
int arg1 = 12;
string _result = await dbUtils.CallFunction(arg1);
if (_result != null)
{
transferDelegate.Invoke(_result );
this.Close();
}
}
}
感谢您的帮助。NH
您应该以其他方式进行操作。让我们举个例子。我将您的DelegateClass
更改为静态Transmitter
类,因为它所做的就是将数据从发送方传输到接收方。它有一个公共事件,任何接收者都可以订阅。
public delegate void DataReceivedEventHandler(object data);
public static class Transmitter
{
public static event DataReceivedEventHandler DataReceived;
public static void TransmitData(object data)
{
DataReceived?.Invoke(data); // Raise the event.
}
}
现在,让我们创建一个可以显示接收到的数据的接收器表单:
public partial class ReceiveDataForm : Form
{
public ReceiveDataForm()
{
InitializeComponent();
// Subscribe the event
Transmitter.DataReceived += Transmitter_DataReceived;
}
private void Transmitter_DataReceived(object data)
{
// Display data.
textBox1.Text = data.ToString();
}
}
我们还需要一个发件人。单击按钮时,它将发送在文本框中输入的数据:
public partial class SendDataForm : Form
{
public SendDataForm()
{
InitializeComponent();
}
private void SendDataButton_Click(object sender, EventArgs e)
{
Transmitter.TransmitData(dataTextBox.Text);
}
}
测试程序会同时打开两个窗口
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var sender = new SendDataForm();
sender.Show();
Application.Run(new ReceiveDataForm());
}
}
当您在发送方表单中输入文本并单击按钮时,文本将自动显示在接收方表单中。