Я вижу два разных способа решения этой проблемы.
Если вы могли бы подумать о размещении команды в MenuStrip
вместо этого, и это та же самая дочерняя форма, которая существует в нескольких случаях в приложении MDI, вы можете добавить команду (и) MenuStrip
элемент управления в дочерней форме. Эти команды меню будут автоматически объединены с командами в родительской форме, но любые события щелчка будут выполняться в активной дочерней форме.
Вы можете контролировать, где и как команды меню из дочерней формы объединяются с командами в родительской форме через свойства MergeAction
и MergeIndex
. При использовании этого подхода вам, вероятно, следует установить для свойства Visible
MenuStrip
в дочерней форме значение false
, чтобы оно не занимало ненужного места в форме.
Второй вариант, который я бы предложил, - создать интерфейс для определения функции поиска, реализовать этот интерфейс в дочерних формах, которые его поддерживают, и использовать событие MdiChildActivate
родительской формы MDI. включить или отключить функцию поиска в зависимости от того, поддерживает ее текущий ребенок или нет.
Упрощенный пример кода второго подхода:
interface IGridSearch
{
void PerformSearch(string criteria);
}
public partial class MdiChildUI : Form, IGridSearch
{
public MdiChildUI()
{
InitializeComponent();
}
public void PerformSearch(string criteria)
{
// peform the search
}
}
public partial class MdiParentUI : Form
{
public MdiParentUI()
{
InitializeComponent();
}
private void MdiParentUI_MdiChildActivate(object sender, EventArgs e)
{
SetControlStates();
}
private void SetControlStates()
{
_searchCommand.Enabled = (this.ActiveMdiChild is IGridSearch);
}
private void _searchCommand_Click(object sender, EventArgs e)
{
IGridSearch child = (this.ActiveMdiChild as IGridSearch);
if (child != null)
{
child.PerformSearch("whatever to search for");
}
else
{
MessageBox.Show("Can't search in the active form");
}
}
}