WinForms菜单工具条获取状态

时间:2010-03-23 14:34:53

标签: c# winforms visibility toolstrip

所以我有一个项目,其中有一些自动初始化通过一些自动创建的类作为全局变量(是的,它们是静态实例)。在这一点内部(它与用户的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:   指数超出范围。一定是   非负和小于的大小   集合。参数名称:index   在   System.Collections.ArrayList.get_Item(的Int32   指数)   System.Windows.Forms.FormCollection.get_Item(的Int32   指数)   Manager.MyMainManager.MyMainManager.RealTimeInit()   在C:\ Dropbox \ My中   Dropbox的\ PUBLIC \计划   代码\机器人世界杯\管理\ MyMainManager \ MyMainManager.cs:行   494在   mainApp.MainForm.ButtonInitClick(对象   发件人,EventArgs e)在C:\ Dropbox \ My中   Dropbox的\ PUBLIC \计划   代码\机器人世界杯\ mainApp \ MainForm.cs:行   389在   System.Windows.Forms.Control.OnClick(EventArgs的   吃   System.Windows.Forms.Button.OnClick(EventArgs的   吃   System.Windows.Forms.Button.OnMouseUp(MouseEventArgs   mevent)at   System.Windows.Forms.Control.WmMouseUp(消息&安培;   m,MouseButtons按钮,Int32点击)   在   System.Windows.Forms.Control.WndProc(消息&安培;   m)at   System.Windows.Forms.ButtonBase.WndProc(消息&安培;   m)at   System.Windows.Forms.Button.WndProc(消息&安培;   m)at   System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息&安培;   m)at   System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息&安培;   m)at   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 个答案:

答案 0 :(得分:2)

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

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;

任何清洁解决方案?

答案 1 :(得分:1)

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