c# - 为什么 ToolStripMenuItem.Click 事件处理程序显示相同的内容?
问题描述
我有一个树视图,其中有一个名为“FTPServerListNode”的节点。
“FTPServerListNode”有 2 个 FTPServerNode,1 个是“serverId1”,另外 1 个是“serverId2”。
FTPServerListNode 和 FTPServerNode 都是从 TreeNode 扩展而来的。
每个子节点都有一个 ToolStripMenuItem。
每个 ToolStripMenuItem 都有自己的点击事件处理程序。
这两个点击事件处理程序只显示节点名称。
但是,我发现两个事件处理程序都显示相同的内容(即“serverId2”)。
这是我的源代码。
using System;
using System.Windows.Forms;
namespace ToolStripMenuItemTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
treeView1.Nodes.Add(new FtpServerListNode());
}
}
internal class FtpServerNode : TreeNode
{
internal FtpServerNode(string serverDesc, string serverId)
{
this.Text = serverDesc;
this.Name = serverId;
}
}
internal class FtpServerListNode : TreeNode
{
internal FtpServerListNode()
{
FtpServerNode ftpServerNode = new FtpServerNode("serverDesc1", "serverId1");
var nN= ftpServerNode.Name;
ToolStripMenuItem removeServerToolStrip = new ToolStripMenuItem();
removeServerToolStrip.Text = "Remove This FTP Server";
removeServerToolStrip.Click += (sender, e) => MessageBox.Show(nN);
ftpServerNode.ContextMenuStrip = new ContextMenuStrip();
ftpServerNode.ContextMenuStrip.Items.Add(removeServerToolStrip);
this.Nodes.Add(ftpServerNode);
ftpServerNode = new FtpServerNode("serverDesc2", "serverId2");
nN= ftpServerNode.Name;
removeServerToolStrip = new ToolStripMenuItem();
removeServerToolStrip.Text = "Remove This FTP Server";
removeServerToolStrip.Click += (sender, e) => MessageBox.Show(nN);
ftpServerNode.ContextMenuStrip = new ContextMenuStrip();
ftpServerNode.ContextMenuStrip.Items.Add(removeServerToolStrip);
this.Nodes.Add(ftpServerNode);
this.Text = "Root Node";
this.Expand();
}
}
}
我附上我的项目屏幕供您参考。
解决方案
请将您的事件处理程序更改为
var mName = ftpServerNode.Name;
removeServerToolStrip.Click += (sender, e) => MessageBox.Show(mName);
您遇到了修改后的闭包问题: https ://www.jetbrains.com/help/resharper/AccessToModifiedClosure.html
推荐阅读
- spring-boot - Spring 自定义存储库 JpaEntityInformation
- asp.net - ASP.NET Boilerplate Angular 编译错误
- android - Flutter webview 文本选择句柄颜色
- c# - grpc服务器端口共享
- html - 如何使用带有 Bootswatch 主题的字形/图标?
- python - cloudcraper.exceptions.CloudflareChallengeError:检测到 Cloudflare 版本 2 挑战。当我将 cloudcraper 模块与 python 一起使用时出错
- android - 不断收到 java.io.InterruptedIOException: Retrofit2 中的超时
- java - 长期任务的弹性模式
- integration - 如何从 state 中获取列表并在 qore 中对其进行修改?
- .net - 在不需要的地方运行 dotnet 的 Rider 中的 Docker-compose