Панель инструментов меню WinForms Получить статус - PullRequest
2 голосов
/ 23 марта 2010

Итак, у меня есть проект, в котором происходит автоматическая инициализация некоторых классов, которые создаются автоматически как глобальные переменные (да, это статические экземпляры).В какой-то момент внутри этого (он не имеет отношения к C # GUI для пользователя, поэтому он не является производным от какого-либо класса C #) мне нужно посмотреть, установлен флаг или нет.

Я использую меню инструментов с проверенным и непроверенным статусом, чтобы установить или снять флаг.Проблема в том, что у меня есть трудности, чтобы увидеть, если флаг установлен или нет из этого статического класса.Мой класс находится в другом проекте / пространстве имен, и создается библиотека DLL, которая позже связана с GUI приложения.Графический интерфейс зависит от этого класса диспетчера, поэтому сделать класс диспетчера зависимым от графического интерфейса не вариант.Тем не менее, я должен быть в состоянии увидеть его состояние, зная его имя или с помощью других средств.Я пробовал следующее:

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

Теперь проблема в том, что в верхнем фрагменте кода я получаю неприятную ошибку.Так как мне это сделать?

Меню всплывающей подсказки: альтернативный текст http://img251.imageshack.us/img251/6473/imagetoolstrip.jpg

Ошибка:

См. В конце этого сообщения подробности о вызовеОтладка по времени (JIT) вместо этого диалогового окна.

************** Текст исключения ************** System.ArgumentOutOfRangeException: индекс был вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: индекс в System.Collections.ArrayList.get_Item (Int32 index) в System.Windows.Forms.FormCollection.get_Item (Int32 index) в Manager.MyMainManager.MyMainManager.RealTimeInit () в C: \ Dropbox \ My Dropbox \ Public\ Program Code \ RoboCup \ Manager \ MyMainManager \ MyMainManager.cs: строка 494 в mainApp.MainForm.ButtonInitClick (отправитель объекта, EventArgs e) в C: \ Dropbox \ My Dropbox \ Public \ Программный код \ RoboCup \ mainApp \ MainForm.cs: строка 389 в System.Windows.Forms.Control.OnClick (EventArgs e) в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) в System.Windows.Forms.Control.WmMouseUp (Message & m, кнопка MouseButtons, щелчки Int32) в System.Windows.Forms.Control.WndProc (Message & m) в System.Windows.Forms.ButtonBase.WndProc (Message & m) в System.Windows.Forms.Button.WndProc (Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Сообщение & m)в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

альтернативный текст 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 ]

2 голосов
/ 23 марта 2010

Ладно, вроде как мне удалось сделать то, что я хотел, однако это не выглядит хорошо, так как любое изменение пути меню вызовет неработоспособность.

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 голос
/ 23 марта 2010

Рассмотрим более нисходящий подход, а не восходящий. Вместо того, чтобы пытаться заставить ваш класс настроек считывать значение из GUI, вместо этого сделайте так, чтобы GUI устанавливал значение в классе настроек при изменении значения GUI. Я использую аналогичный подход в своем собственном приложении, и в моем классе настроек есть открытый метод ReloadValues(), который можно вызвать, если я внесу изменения в хранилище данных.

...