Отображение дочернего элемента MDI — случайной формы, видимой только в течение миллисекунды, появляющейся на экране

#c# #winforms #visual-studio-2015 #mdi

#c# #winforms #visual-studio-2015 #mdi

Вопрос:

У меня есть форма MDI с древовидным изображением слева, а форма отображается справа с разделителем в левую сторону. Я хочу открыть форму на основе щелчка пользователя по узлу в treeview, как мне это сделать правильно. Проблема в том, что когда я открываю новую форму, на экране появляется случайная форма на миллисекунду, а затем она исчезает, а та, которая должна появиться, отображается сразу после. Вот мой код на данный момент:

 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    CloseAllMdiChildForms();
    if (e.Node.Name == "root")
    {
        CustomerFrm cf = new CustomerFrm();
        cf.Show();
        cf.MdiParent = this;
    }

    //treeView1.MouseClick();
    //if (treeView1.SelectedNode.Level == 0)
    //{
    //    CustomerFrm CF = new CustomerFrm();
    //    CF.ShowDialog();
    //}
} 
 

На экране без причины появляется случайная форма, видимая только в течение миллисекунды. В чем проблема?

Комментарии:

1. В чем проблема?

2. На экране без причины появляется случайная форма, видимая только в течение миллисекунды.

3. Это потому, что вы сначала показываете форму, а затем устанавливаете ее MdiParent . Поэтому он мерцает; он отображается за пределами области mdi, а затем, после установки его родительского элемента mdi, он отображается в клиентской области mdi. Чтобы решить проблему, достаточно сначала установить cf.MdiParent = this; , а затем вызвать cf.MdiParent = this; .

4. Кстати, я исправил свою опечатку в ответе: сначала установите cf.MdiParent = this; , а затем вызовите cf.Show(); .

Ответ №1:

Мерцание происходит потому, что вы сначала показываете форму, а затем устанавливаете ее MdiParent . Таким образом, он мерцает; он отображается за пределами области mdi, а затем после его настройки MdiParent отображается в клиентской области mdi.

Чтобы решить проблему, достаточно сначала установить cf.MdiParent = this; , а затем вызвать cf.Show(); .

Ответ №2:

На основе прокомментированного кода искомое событие называется NodeMouseClick .

 private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Node.Name == "root")
    {
        CustomerFrm childForm = new CustomerFrm();
        childForm.MdiParent = this;
        childForm.Show();
    }
}