1

C# の学習で何か新しいことをしようとしています。私は最近、コンテキスト メニューを直接設定して入力することについて、同様の質問を投稿しました。これが完了したので、必要な実行を取得するのに行き詰まっていることに気づきました。

ユーザー定義のクイック アクセス リストを作成しています。単なる名前と IP アドレスです。

xml docmuent からリストを作成し、次の方法でコンテキスト メニューに追加しています。

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,..."

ルックアップは簡単です。項目を Dictionary に入れるだけです。

3回目の編集

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);


     }

送信者オブジェクトは、イベントを発生させたクラスであるため、その型がわかっている場合はキャストできます。

実際のコードは「オブジェクト送信者」を使用しているため、自分でキャストする必要があります。

 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 に答える