C# 委托引用为NULL
我对引用C# 委托引用为NULL,c#,windows,forms,C#,Windows,Forms,我对引用null的代理有问题,我有以下问题: 首先,我定义要执行操作的代理: public delegate void MandarComponente(int Componente); public event MandarComponente MandarComp; 由于我希望这是一个拖放操作,我将把一些重要的东西的代码拖放 private void Capacitor_MouseDown(object sender, System.Windows.Form
null
的代理有问题,我有以下问题:
首先,我定义要执行操作的代理:
public delegate void MandarComponente(int Componente);
public event MandarComponente MandarComp;
由于我希望这是一个拖放操作,我将把一些重要的东西的代码拖放
private void Capacitor_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) //This is a PictureBox Event
{
componente = 1;
Capacitor.DoDragDrop(Capacitor.Image, DragDropEffects.Copy | DragDropEffects.Move);
}
一旦我有了它,我就会在比赛中使用它
public void tableLayoutPanel2_DragDrop(object sender, DragEventArgs e)
{
Point pl = new Point(this.Location.X + tableLayoutPanel2.Location.X + 10, this.Location.Y + tableLayoutPanel2.Location.Y + 32);
int R = (int)((e.Y - pl.Y) / pictureBox1.Height);
int C = (int)((e.X - pl.X) / pictureBox1.Width);
Console.WriteLine("X=" + e.X + "Y=" + e.Y + " [" + C + ", " + R + "]");
if (R == tableLayoutPanel2.RowCount) R--;
if (C == tableLayoutPanel2.ColumnCount) C--;
PictureBox pictureBox = (PictureBox)tableLayoutPanel2.GetControlFromPosition(C, R);
if (R == 0 && C == 0 || R == 2 && C == 0 || R == 2 && C == 2 || R == 0 && C == 2)
{
MessageBox.Show("¡No puedes poner un componente ahí!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
pictureBox = null;
}
if (componente == 1 && pictureBox != null)
{
pictureBox.Image = Capacitor.Image;
MandarComp(componente);
MandarComp = new MandarComponente(CambiarTexto);
if (R == 1 && C == 2 || R == 1 && C == 0)
{
pictureBox.Image.RotateFlip(RotateFlipType.Rotate90FlipNone);
}
}
即引用此方法:
void CambiarTexto(int Componente)
{
if(Componente==1)
{
label5.Text = "Componente Seleccionado: CAPACITOR";
}
}
但是MandarCom(component)
的部分总是有一个异常NullReferenceException
编辑:基本上我想做的是委托
mandarcomponent(int component)
保存component
,然后将其发送到CambiarTexto
方法,以便它在label5.Text
中执行操作 对于使用事件,在调用它之前,首先必须给它一个值,这意味着赋值和调用的索引是错误的。
这应该是:
MandarComp += CambiarTexto;//For event, += is used more offen than directly assignment.
MandarComp(Componente);
这应该行得通
此外,如果您使用的是最新版本的C#,它允许您这样编写MandarComp?.Invoke()
,以避免出现NullReferenceException
此外,我还建议您从委托和事件的一些基本用法开始。
如果您的委托只是在owner类中使用,那是一种浪费。直接调用该方法也会做同样的事情。对于使用事件,在调用它之前,首先必须给它一个值,这意味着赋值和调用的索引是错误的。 这应该是:
MandarComp += CambiarTexto;//For event, += is used more offen than directly assignment.
MandarComp(Componente);
这应该行得通
此外,如果您使用的是最新版本的C#,它允许您这样编写MandarComp?.Invoke()
,以避免出现NullReferenceException
此外,我还建议您从委托和事件的一些基本用法开始。
如果您的委托只是在owner类中使用,那是一种浪费。直接调用该方法也会做同样的事情。欢迎使用堆栈溢出。“但是MandarCom(component)的部分始终显示NullReferenceException的异常”-然后
MandarCom
为空。您还没有解释为什么希望它不为空。(也不清楚你为什么在调用它之后将其设置在行中-这对于事件来说非常不寻常。)@JonSkeet我是事件处理程序和委托的新手,所以我尝试创建一个委托,它可以将组件
发送到事件CambiarTexto
,因此标签中的文本是changedOkay,我认为最好是阅读一篇关于事件和代表的教程。通常情况下,您希望订阅事件(并且您不会在自己的类中设置它)MandarComp(component)
将调用所有现有的事件订阅者,但您没有任何订阅者。我建议您从@JonSkeet开始,谢谢,事实上我刚刚看到代理用于链接程序外部的代码;所以基本上我用错了;但是我没有找到更好的方法,这是我想到的第一件事。但真的很感谢,我要看一些关于事件和如何处理它们的教程!如果您只想调用CambiarTexto
,只需这样做:CambiarTexto(component)代码>。这就是进行方法调用所需的全部内容。不需要委托或事件。欢迎使用堆栈溢出。“但是MandarCom(component)的部分始终显示NullReferenceException的异常”-然后MandarCom
为空。您还没有解释为什么希望它不为空。(也不清楚你为什么在调用它之后将其设置在行中-这对于事件来说非常不寻常。)@JonSkeet我是事件处理程序和委托的新手,所以我尝试创建一个委托,它可以将组件
发送到事件CambiarTexto
,因此标签中的文本是changedOkay,我认为最好是阅读一篇关于事件和代表的教程。通常情况下,您希望订阅事件(并且您不会在自己的类中设置它)MandarComp(component)
将调用所有现有的事件订阅者,但您没有任何订阅者。我建议您从@JonSkeet开始,谢谢,事实上我刚刚看到代理用于链接程序外部的代码;所以基本上我用错了;但是我没有找到更好的方法,这是我想到的第一件事。但真的很感谢,我要看一些关于事件和如何处理它们的教程!如果您只想调用CambiarTexto
,只需这样做:CambiarTexto(component)代码>。这就是进行方法调用所需的全部内容。不需要代表或事件。我认为值得注意的是,这是事件的一个非常奇怪的用法。如果OP只想在同一个类中调用一个方法,那么使用事件是没有意义的。事件的目的是让外部代码订阅它,目前还没有迹象表明这正在发生。是的,这个答案会使错误消失——但在理解事件方面没有任何改进。@JonSkeet是的。我将编辑答案。下次我会在发布答案之前重新考虑。我认为值得注意的是,这是一个非常奇怪的事件用法。如果OP只想在同一个类中调用一个方法,那么使用事件是没有意义的。事件的目的是让外部代码订阅它,目前还没有迹象表明这正在发生。是的,这个答案会使错误消失——但在理解事件方面没有任何改进。@JonSkeet是的。我将编辑答案。下一次我会在发布答案之前重新考虑。