Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:检索不带sender对象的激发事件的源_C# - Fatal编程技术网

C#:检索不带sender对象的激发事件的源

C#:检索不带sender对象的激发事件的源,c#,C#,我正在使用GMaps.NET控件,我捕获了事件“TileLoadComplete”: 我在运行时创建了几个控件,所有控件都共享该事件的相同功能: for (int i = 0; i < 5; i++) { GMap.NET.WindowsForms.GMapControl control = new GMap.NET.WindowsForms.GMapControl(); control.Manager.Mode = AccessMode.ServerOnly;

我正在使用GMaps.NET控件,我捕获了事件“TileLoadComplete”:

我在运行时创建了几个控件,所有控件都共享该事件的相同功能:

for (int i = 0; i < 5; i++)
{
    GMap.NET.WindowsForms.GMapControl control = new GMap.NET.WindowsForms.GMapControl();
    control.Manager.Mode = AccessMode.ServerOnly;
    control.MapProvider = GMap.NET.MapProviders.GoogleSatelliteMapProvider.Instance;
    control.OnTileLoadComplete += Control_OnTileLoadComplete;
    // set other map properties
}

private void Control_OnTileLoadComplete(long ElapsedMilliseconds)
{
    // who has completed the loading?
}
for(int i=0;i<5;i++)
{
GMap.NET.WindowsForms.GMapControl控件=新建GMap.NET.WindowsForms.GMapControl();
control.Manager.Mode=AccessMode.ServerOnly;
control.MapProvider=GMap.NET.MapProviders.GoogleSatelliteMapProvider.Instance;
control.OnTileLoadComplete+=控件\u OnTileLoadComplete;
//设置其他贴图属性
}
专用无效控制\u OnTileLoadComplete(长延时毫秒)
{
//谁已完成装载?
}

因为事件签名中没有sender对象,我想知道是否有其他方法可以知道哪个控件已经完成了映射的加载。

这样行吗?使用lambda捕获发送者:

for (int i = 0; i < 5; i++)
{
    GMap.NET.WindowsForms.GMapControl control = new GMap.NET.WindowsForms.GMapControl();
    //...snip...
    control.OnTileLoadComplete += x => Control_OnTileLoadComplete(control, x);
}

private void Control_OnTileLoadComplete(object sender, long ElapsedMilliseconds)
{
    // who has completed the loading?
    // the sender, that's who!
}
for(int i=0;i<5;i++)
{
GMap.NET.WindowsForms.GMapControl控件=新建GMap.NET.WindowsForms.GMapControl();
//…剪断。。。
control.OnTileLoadComplete+=x=>control\u OnTileLoadComplete(control,x);
}
私有无效控制\u OnTileLoadComplete(对象发送方,长延时毫秒)
{
//谁已完成装载?
//发送者,就是他!
}

您必须更新
Control\u OnTileLoadComplete
的每个用法才能使用该lamdba。您可以将类型从
对象发送者
更改为
GMapControl发送者
,如果唯一的“发送者”类型为
GMapControl
,这样行吗?使用lambda捕获发送者:

for (int i = 0; i < 5; i++)
{
    GMap.NET.WindowsForms.GMapControl control = new GMap.NET.WindowsForms.GMapControl();
    //...snip...
    control.OnTileLoadComplete += x => Control_OnTileLoadComplete(control, x);
}

private void Control_OnTileLoadComplete(object sender, long ElapsedMilliseconds)
{
    // who has completed the loading?
    // the sender, that's who!
}
for(int i=0;i<5;i++)
{
GMap.NET.WindowsForms.GMapControl控件=新建GMap.NET.WindowsForms.GMapControl();
//…剪断。。。
control.OnTileLoadComplete+=x=>control\u OnTileLoadComplete(control,x);
}
私有无效控制\u OnTileLoadComplete(对象发送方,长延时毫秒)
{
//谁已完成装载?
//发送者,就是他!
}


您必须更新
Control\u OnTileLoadComplete
的每个用法才能使用该lamdba。您可以将类型从
object sender
更改为
GMapControl sender
如果唯一的“sender”类型为
GMapControl

,您可以尝试查看调用堆栈gosh,代码中似乎有一个名为
control
的变量。它装的是什么?我敢打赌,如果您在触发事件时仍存在的范围内保留它(不管是什么,因为您的问题没有上下文),您将拥有所需的对象。还有,为什么gmap.net不能使用标准事件模式?他们很烂。“告诉他们。”谢谢你指出这一点。我已经更新了这个问题。如前所述,我在运行时创建了几个隐藏的“控件”,但它们都具有相同的事件函数。在这里,我添加了一个for循环,在应用程序中它取决于用户请求。如何
control.OnTileLoadComplete+=m=>control\u OnTileLoadComplete(control,m)
然后将处理程序签名更改为
control\u OnTileLoadComplete(GMapControl control,long elapsedmillyses)
@KMoussa有一个非常好的解决方案,应尽快将其添加到下面。哎呀。你可以试着看一下调用stackGosh,代码中似乎有一个变量名为
control
。它装的是什么?我敢打赌,如果您在触发事件时仍存在的范围内保留它(不管是什么,因为您的问题没有上下文),您将拥有所需的对象。还有,为什么gmap.net不能使用标准事件模式?他们很烂。“告诉他们。”谢谢你指出这一点。我已经更新了这个问题。如前所述,我在运行时创建了几个隐藏的“控件”,但它们都具有相同的事件函数。在这里,我添加了一个for循环,在应用程序中它取决于用户请求。如何
control.OnTileLoadComplete+=m=>control\u OnTileLoadComplete(control,m)
然后将处理程序签名更改为
control\u OnTileLoadComplete(GMapControl control,long elapsedmillyses)
@KMoussa有一个非常好的解决方案,应尽快将其添加到下面。哇,非常有趣和强大的方法!在我了解如何在后台加载地图后,我将报告它是否有效。现在事件永远不会触发,因为如果控件不可见,GMapControl实际上不会加载映射。我希望它可以工作,需要注意的是,您将无法注销事件处理程序,因为它是一个匿名方法。这意味着GC不会自动处理这些对象,因为仍然附加了事件处理程序?@Mark这意味着附加事件的对象将需要至少与订阅事件的对象一样存在。如果你不打算取消订阅活动,那么在原始代码中也会发生这种情况,这只会使取消订阅代码变得更加乏味,而不是不可能。非常有趣和强大的方法!在我了解如何在后台加载地图后,我将报告它是否有效。现在事件永远不会触发,因为如果控件不可见,GMapControl实际上不会加载映射。我希望它可以工作,需要注意的是,您将无法注销事件处理程序,因为它是一个匿名方法。这意味着GC不会自动处理这些对象,因为仍然附加了事件处理程序?@Mark这意味着附加事件的对象将需要至少与订阅事件的对象一样存在。如果您不打算取消订阅活动,那么在原始代码中也会发生这种情况,这只会使取消订阅代码变得更加乏味,而不是不可能。