【问题标题】:Adding to strip menu at run time在运行时添加到条形菜单
【发布时间】:2011-11-27 06:30:22
【问题描述】:

好的,我有一个字符串列表(实际上是文件名),我想创建一个文件菜单动态表单。

因此,获取我的文件名列表,目录字符串和文件后缀的第一个代码条(对于额外的问题,我如何将两个删除行合并为一个?)

List<string> test_ = populate.Directorylist();

        foreach (var file_ in test_)
        {
            int len_ = file_.Length;
            string filename_ = file_.Remove(0, 8);
            filename_ = filename_.Remove(filename_.Length - 4).Trim();


            ToolStripItem subItem = new ToolStripMenuItem(filename_);
            subItem.Click += new EventHandler(populate.openconfig(file_)); //this is my problem line
            templatesToolStripMenuItem.DropDownItems.Add(subItem); 

因此,只需在列表中循环并每次将一个项目添加到“templatesToolStripMenuItem”。

但我需要添加一个事件,当用户单击该项目时,它将 file_ 变量发送到 populate.openconfig 方法。

所以添加项目工作正常,我该如何添加事件处理?

我想我可以将它发送到一个默认方法,该方法在原始数组中搜索完整文件名并按照这种方式进行操作。但是当我将项目添加到菜单栏时,我当然可以做到这一点。

谢谢

亚伦

所以是的,最后我添加了

subItem.tag = File_
....

then have the event handle to 

 void subItem_Click (object sender, EventArgs e) //open files from menu
        { 
            ToolStripMenuItem toolstripItem = (ToolStripMenuItem)sender;
            string filename_ = toolstripItem.Tag.ToString(); //use the tag field
            populate.openconfig(filename_);
            populate.Split(_arrayLists); //pass read varible dictonary to populate class to further splitting in to sections.
            Populatetitle();//Next we need to populate the Titles fields and datagrid view that users will  enter in the Values
        } 

刚刚看到我可以多整理一下:)

为帮助的家伙干杯,只是喜欢你可以用多少方法给猫剥皮 :)

【问题讨论】:

标签: c# menu toolstripmenu


【解决方案1】:
List<string> test_ = populate.Directorylist();

        foreach (var file_ in test_)
        {
            int len_ = file_.Length;
            string FullFilename_ = file_.Remove(0, 8);
            string filename_ = FullFilename_.Remove(filename_.Length - 4).Trim();    

            ToolStripItem subItem = new ToolStripMenuItem(filename_);
            subItem.Tag = FullFilename;
            subItem.Click += new EventHandler(populate.openconfig(file_)); //this is my problem line
            templatesToolStripMenuItem.DropDownItems.Add(subItem); 

然后您可以从事件处理程序访问 Tag 属性。

void subItem_Click (object sender, EventArgs e)
 {
      ToolStripMenuItem toolstripItem = sender as ToolStripMenuItem;

      if (toolstripItem != null && toolstripItem.Tag != null)
      {
          yourObject.openconfig(toolstripItem.Tag.ToString))
      }
 }

还有一点,您可以使用Path 类进行文件路径操作。 GetFileName、GetFileNameWithoutExtension 等有很多方法。

string filePath = "C:\diectory\name.txt";
string fileNameWithoutExt = Path.GetFileNameWithoutExtension(filePath);

【讨论】:

  • 很高兴看到有人与您的代表提出了与我一起解决的相同的解决方案 :) 并且路径类非常有效,感谢您的提示。
【解决方案2】:

如果我理解正确的话,你大概有这个 openconfig 方法,你希望能够响应任何文本。

您作为事件处理程序传递的方法必须是 void MethodName (object sender, EventArgs e) 的形式,因此您不能直接将字符串传递给它。

但是,一旦您在事件句柄消息中,您就可以调用相关消息。例如。

 subItem.Click += new EventHandler(subItem_Click)
 ...
 void subItem_Click (object sender, EventArgs e)
 {
      ToolStripMenuItem toolstripItem = (ToolStripMenuItem)sender;
      yourObject.openconfig(toolstripItem.Text)
 }

如果您的对象在该范围内不可用,您可以将事件处理程序放在您的对象中并执行相同的操作。

【讨论】:

  • 好的,所以我认为它必须完成,在代码中我有 file_ = "diectory\name.txt" 而 filename_ = "name"。当前项目的文本是“名称”,因此使用这种方法,一旦我用事件句柄调用它,我必须在方法中查找完整的文件名。对我来说似乎有点复制。很容易做到,只是想知道我是否可以直接从事件中传递完整的文件名。
  • 你可以使用 lambda 表达式,但它本质上是做同样的事情:item.Click += (o, e) =&gt; { ToolStripMenuItem a = (ToolStripMenuItem)o; A.openconfig(a.Text); };
  • OK 简单,只需使用标签字段并使用完整的文件名;)。所以是的,谢谢你的回答,应该很好:)
  • 您可以做更多的工作,创建一个继承自 ToolStripMenuItem 的类,该类还有一个存储完整文件名的字符串,然后以这种方式访问​​它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
相关资源
最近更新 更多