1

SOがいくつかのロジックを単純化するのに役立つかどうか疑問に思いました。System.Windows.Forms.MenuStripを含むWindowsフォーム(C#2.0)があります。

  1. ToolStripMenueItemsをMenuStripに動的に追加したいと思います。追加されたアイテムはデータベースから削除されます(ただし、簡単にするために、以下のコードからその部分を削除しました)。
  2. 複雑なメニューを作成できるようにしたいと思います(つまり、[ツール]>[数学]>[計算]、[ヘルプ]> [ドキュメント]、[ヘルプ]> [バージョン情報]、[フォーマット]> [エンコード]>[西洋]、[フォーマット]>[エンコード]>[その他]>[ギリシャ語])。

以下のコードは機能しているようですが、loadToolbars()をより効率的/シンプルにするために何をしますか?

これは私が助けを必要としている機能です:

void loadToolbars()
{
    foreach(Toolbar t in getToolStripItems())
    {
        string[] toolPath = t.toolbar.Split(">".ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
        ToolStripMenuItem root = null;
        ToolStripItem[] foundItems;

        /*
         * follow the path of each Toolbar item.  If we find a dead-end,
         * add the missing part
         */
        for(int i=0; i<toolPath.Length; i++)
        {
            if(root == null)
            {
                //Search the main menu strip (System.Windows.Forms.MenuStrip)
                foundItems = DA_Menu.Items.Find(toolPath[i],false);
            }else
            {
                //Continue searching were we left off
                foundItems = root.DropDownItems.Find(toolPath[i],false);
            }

            if(foundItems.Length>0)
            {
                foreach(ToolStripItem item in foundItems)
                {
                    //Is this the Toolbar item I am looking for?
                    if(item.Text == toolPath[i])
                    {
                        if(item.OwnerItem != null && i>0)
                        {
                            if((item.OwnerItem.Text == toolPath[i-1]) 
                                && (item.Text == toolPath[i]))
                                root = (ToolStripMenuItem)item;
                        }else
                        {
                            root = (ToolStripMenuItem)item;
                        }
                    }
                }
            }else
            {
                //We hit a dead-end.  Add the missing path
                if(root == null)
                {
                    root = new ToolStripMenuItem(toolPath[i]);
                    root.Name = toolPath[i];
                    DA_Menu.Items.Add(root);
                }else
                {
                    ToolStripMenuItem tsmi = new ToolStripMenuItem(toolPath[i]);
                    tsmi.Name = toolPath[i];
                    root.DropDownItems.Add(tsmi);
                    root = tsmi;
                }
            }
        }

        //Add the Toobar item to the path that was built above
        t.Click +=new EventHandler(Toolbar_Click);
        ((ToolStripMenuItem)root).DropDownItems.Add(t);
    }
}

以下のすべてに満足していますが、他の人が私がしていることに従うのを助けるためにそれを提供しています。

この関数はデータ駆動型ですが、SOの利益のためにハードコーディングされています

private List<Toolbar> getToolStripItems()
{
   List<Toolbar>toolbars = new List<Toolbar>();

   Toolbar t = new Toolbar();
   t.Text = "Calc";
   t.path = "c:\windows\system32\calc.exe";
   t.toolbar = "Tools>Microsoft>Math";

   toolbars.Add(t);

   t = new Toolbar()
   t.Text = "Calc2";
   t.path = "c:\windows\system32\calc.exe";
   t.toolbar = "Tools>Math>Microsoft";

   toolbars.Add(t);

   return toolbars;
}

クリックイベントをシンプルに保つためのカスタムクラス

class Toolbar:ToolStripMenuItem
{
    public string path;
    public string toolbar;
    public Toolbar()
    {
        /*
         * Set the name to the Text value
         * so that it can be found in collection
         * by key
         */
        base.Name = Text;
    }
}

すべてのツールバー項目のクリックイベントは、この関数で処理されます

void Toolbar_Click(object sender, EventArgs e)
{
    //Get the Toolbar item that was clicked
    Toolbar t = (Toolbar)sender;

    //Start new process
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.FileName = t.path;
    p.Start();
}
4

1 に答える 1

1

問題は、データの形式です。その形式に固執する場合、やることはあまりないと思います。

それ以外の場合は、データを「Tools> Microsoft> Math」のようなフラットフィールド構造からTreeListのようなものに変更します。たとえば、アプリエントリを含むMathリストを含むMicrosoftリストを含むToolsリストなどです。データベースにその構造を構築することもできます。

次に、メニュー項目を再帰的に簡単に追加できます。

于 2009-10-12T19:22:02.847 に答える