1

我正在尝试在学习 C# 时做一些新的事情。我最近发布了一个与直接设置和填充上下文菜单类似的问题。现在我已经完成了,我发现自己无法获得所需的执行。

我正在创建一个用户定义的快速访问列表。它只是一个名称和 IP 地址。

我正在从 xml 文档填充列表并通过以下方式添加到上下文菜单:

ToolStripMenuItem.DropDownItems.Add(string name, image, eventargs onClick)

我被困的地方是试图弄清楚如何告诉点击事件使用什么 IP。我知道在方法参数中我可以通过向函数添加另一个参数来传递 IP 地址,例如:

doSomething("Hello World");

  void doSomething(cmd)
{
 messageBox.Show(cmd);
}

如何让我的变量菜单选项为名称指明正确的 IP 地址?我假设如果我可以使用正确的 IP,那么我也可以使用相同的方法来使用密码。所以我的代码看起来像:

 private void addToolStripMenuItem_Click(object sender, EventArgs e)
        {
         ...
          foreach(xml node in xml doc)
           {
            Room r = new Room();
            r.Name =xNode.SelectSingleNode("Name").InnerText;
            r.IP = xNode.SelectSingleNode("IP").InnerText;
            r.passwrd=xNode.SelectSingleNode("Pass").InnerText;
            locations.add(r);
            presetsToolStripMenuItem.DropDownItems.Add(r.Name, null, disp);
            }    
        }
 void disp(object sender, EventArgs e)
        {
            MessageBox.Show(r.Name's IP address);
            MessageBox.Show(r.Name's password);
        }

我不反对使用另一种方法来做到这一点。这正是我能找到的最简单的。我只是想确保它保持简单并且上下文菜单/列表是从 xml 文档中填充的。

4

1 回答 1

2

通过使用 DropDownItem 的 Tag 属性,这是一种略显丑陋的方法。

使用您的代码:

var item = new ToolStripMenuItem(string name, image, eventargs onClick);
item.Tag = "your.ip.address";
ToolStripMenuItem.DropDownItems.Add(item)

然后,

private void addToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var item = sender as ToolStripMenuItem;
            Room r = new Room();
            r.Name ="Name"; 
            r.IP = item.Tag.ToString();
            r.passwrd="Password";

            presetsToolStripMenuItem.DropDownItems.Add(r.Name, null, disp);

        }

另一种可能的解决方案:

我不确定你的类是如何布局的,但你可能想要一个单独的查找类来存储 Name->IP 的映射。然后做这样的事情,

var item = sender as ToolStripMenuItem;
IPLookuper.GetIP(item.Text);//.Text corresponds to name in  "ToolStripMenuItem(string name,..."

查找很容易,只需将项目放入字典中即可。

第三次编辑

因为你知道调用 disp 方法的类型,你可以这样想,

 void disp(ToolStripMenuItem sender, EventArgs e)
     {
     var ip = sender.Tag.ToString();
     //Lookup the name/password/whatever based on the IP.
     MessageBox.Show(r.Name's IP address);
     MessageBox.Show(r.Name's password);


     }

sender 对象就是触发事件的任何类,所以如果你知道它是什么类型,你可以强制转换它。

由于您的实际代码使用“对象发送者”,因此您只需要自己进行转换。

 void disp(object sender, EventArgs e)
     {
     var item = sender as ToolStripMenuItem;
     var ip = item.Tag.ToString();
     //Lookup the name/password/whatever based on the IP.
     MessageBox.Show(r.Name's IP address);
     MessageBox.Show(r.Name's password);

     }
于 2012-04-07T04:10:03.183 回答