首页 文章

WinForms菜单工具条获取状态

提问于
浏览
2

所以我有一个项目,其中有一些自动初始化通过一些自动创建的类作为全局变量(是的,它们是静态实例) . 在这一点内部(它与用户的C#GUI无关,因此它不是从任何C#类派生的)我需要查看是否设置了标志 .

我使用带有选中和未选中状态的工具栏菜单来设置或取消设置标志 . 问题是我很难看到是否从这个静态类中检查了标志 . 我的类位于不同的项目/命名空间内,并创建一个DLL,后者链接到应用程序的GUI . GUI取决于此Manager类,因此使Manager类依赖于GUI不是一个选项 . 然而,我应该能够看到它的国家知道它的名字或通过其他方式 . 我尝试过以下方法:

if(Application.OpenForms[0].Owner.Controls["_useLocalImageForInitToolStripMenuItem"].Enabled)
{  };

现在的问题是,在上面的代码片段中,我得到了一个令人讨厌的错误 . 那我该怎么做?

工具栏菜单:alt text http://img251.imageshack.us/img251/6473/imagetoolstrip.jpg

错误:

有关调用实时(JIT)调试而不是此对话框的详细信息,请参阅此消息的结尾 . 异常文本 System.ArgumentOutOfRangeException:索引超出范围 . 必须是非负数且小于集合的大小 . 参数名称:System.Collections.ArrayList.get_Item(Int32索引)中的索引,位于C:\ Dropbox \ My Dropbox \ Public中Manager.MyMainManager.MyMainManager.RealTimeInit()的System.Windows.Forms.FormCollection.get_Item(Int32索引) \ Program Code \ RoboCup \ Manager \ MyMainManager \ MyMainManager.cs:第494行,位于C:\ Dropbox \ My Dropbox \ Public \ Program Code \ RoboCup \ mainApp \ MainForm.cs中的mainApp.MainForm.ButtonInitClick(Object sender,EventArgs e) :位于System.Windows上System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)的System.Windows.Forms.Button.OnClick(EventArgs e)中System.Windows.Forms.Control.OnClick(EventArgs e)的第389行 . 在System.Windows.Forms的System.Windows.Forms.ButtonBase.WndProc(Message&m)的System.Windows.Forms.Control.WndProc(Message&m)处的Forms.Control.WmMouseUp(Message&m,MouseButtons按钮,Int32单击) . System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)中的System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)上的Button.WndProc(Message&m)在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)

alt text http://img185.imageshack.us/img185/2734/20100323095952.png

随着 private System.Windows.Forms.ToolStripMenuItem _useLocalImageForInitToolStripMenuItem;

this._useLocalImageForInitToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
                    this._useLocalImageForInitToolStripMenuItem.Name = "_useLocalImageForInitToolStripMenuItem";
                    this._useLocalImageForInitToolStripMenuItem.Size = new System.Drawing.Size(242, 22);
                    this._useLocalImageForInitToolStripMenuItem.Text = "Use local image for Initialization";
                    this._useLocalImageForInitToolStripMenuItem.Click += new System.EventHandler(this.

2 回答

  • 1

    好吧,我设法做了我想要的事情,但它看起来不太好,因为对菜单路径的任何修改都会导致非功能性 .

    var alfa = ((((Application.OpenForms[0].Controls["_menustripMenu"] 
                                                 as System.Windows.Forms.MenuStrip).
                     Items["_settingsToolStripMenuItem"] 
                                          as System.Windows.Forms.ToolStripMenuItem).
                     DropDownItems["_cameraToolStripMenuItem"] 
                                          as System.Windows.Forms.ToolStripMenuItem).
                     DropDownItems["_useLocalImageForInitToolStripMenuItem"] 
                                  as System.Windows.Forms.ToolStripMenuItem).Checked;
    

    有清洁的解决方案

  • 2

    考虑采用更自上而下的方法,而不是自下而上 . 而不是试图让您的设置类从GUI读取值,而是在GUI值更改时让GUI在设置类中设置值 . 我在自己的应用程序中使用类似的方法,我的设置类有一个公共 ReloadValues() 方法,如果我对后备数据存储进行更改,则可以调用该方法 .

相关问题