Вопрос № 167181: Здравствуйте. В приложении на VB имеется форма, которая содержит главное меню с вложенными подменю и является родительской к другим формам. В одной из дочерних форм при закрытии необходимо скрыть один из пунктов подменю в родительской форме. Чтобы до...
Вопрос № 167.181
Здравствуйте. В приложении на VB имеется форма, которая содержит главное меню с вложенными подменю и является родительской к другим формам. В одной из дочерних форм при закрытии необходимо скрыть один из пунктов подменю в родительской форме. Чтобы достучаться до него пришлось написать обработчик события закрытия формы так:
Код:
Private Sub NewActForm_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
Dim itm, itm2, itm3 As ToolStripMenuItem For Each itm In Me.ParentForm.MainMenuStrip.Items If itm.Name = "ДействияToolStripMenuItem" Then For Each itm2 In itm.DropDownItems If itm2.Name = "А
ктыToolStripMenuItem" Then For Each itm3 In itm2.DropDownItems If itm3.Name = "ДействияСНовымАктомToolStripMenuItem" Then itm3.Visible = False End If Next End If Next End If Next
End Sub
код отрабатывает нормально, но он мне не нравится. Всвязи
с этим вопрос: как правильно "достучаться" из дочерней формы до itm3 в родительской форме без открытия всех этих переборов итемов менюх и подменюх? Заранее, спасибо.
Отвечает: Hankir
Здравствуйте, Loststranger! При создании (вызове) дочерней формы передавай ссылку на itm3.
Ответ отправил: Hankir (статус: 1-й класс)
Ответ отправлен: 13.05.2009, 16:11
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 249110 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 4 Комментарий оценки: В принципе можно, но от этого варианта я отказался в силу необходимости отслеживать в коде такие ссылки, которые могут в итоге быть массовыми. Спасибо.
Отвечает: Evgenijm
Здравствуйте, Loststranger!
Вот варианты:
1) То безобразие, которое Вам не нравится, можно укоротить так: ToolStripDropDownItem TS = (ToolStripDropDownItem)this.ParentForm.MainMenuStrip.Items["ДействияToolStripMenuItem"]; TS = (ToolStripDropDownItem)TS.DropDown.Items["АктыToolStripMenuItem"]; TS = (ToolStripDropDownItem)TS.DropDown.Items["ДействияСНовымАктомToolStripMenuItem"]; TS.Visible = false;
2) Самый грязный. Можно сделать поле, которое хранит
ДействияСНовымАктомToolStripMenuItem, открытым и обращаться к нему напрямую. Тогда ParentForm надо привести к типу Вашей родительской формы.
3) Можно сделать открытое свойство или метод в родительской форме, который будет сам делать нужное. Вызывать его придется как в варианте 2.
4) В родительской форме создать обработчик закрытия дочерней формы. Этот вариант лучше предыдущих. private void button1_Click_1(object sender, EventArgs e)
{ Form2 f2 = new Form2(); f2.MdiParent = this; f2.FormClosed += ChildClosed; f2.Show(); }
5) Перестроить меню так, чтобы пункты для дочерних окон в них же и находились. Просто создайте у дочернего окна свое меню - и оно "склеится" с родительским. Этот метод самый чистый,
но может потребовать существенной переделки. Зато код будет собран там, где должен.
Выбирайте 4й или 5й вариант :)
Ответ отправил: Evgenijm (статус: 5-й класс)
Ответ отправлен: 13.05.2009, 19:14
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 249123 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5 Комментарий оценки: Очень развёрнутый и понятный ответ. Ожидал в основном ответа в виде пункта 1, но остановился в итоге на варианте 5. Спасибо.
Скажите "спасибо" эксперту, который помог Вам!
Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
на короткий номер 1151 (Россия)
Номер ответа и конкретный текст СМС указан внизу каждого ответа.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.