Los controles de texto no permiten seleccionar el texto con el mouse cuando TopLevel = false

programación


¡Hola a todos!

Tengo un problema con los TextBoxes en mi formulario.

Captura de pantalla como imagen http://rghost.ru/5011999/image.png

Demostremos la situación con un ejemplo sencillo.

1) Cree un nuevo proyecto de winforms con Form1;
2) Cree un nuevo Form2 y colóquele el control TextBox;
3) Escribamos un código simple que cree la forma no modal;

MEDIO
Form frm = new Form();
frm.StartPosition = FormStartPosition.CenterParent;
frm.TopLevel = false; // here is the problem
frm.Parent = this;
frm.Show();
frm.BringToFront();

Una vez que ejecute este código, aparecerá el formulario con el cuadro de texto.
Escriba algo en el cuadro de texto, por ejemplo “esto es una prueba”. Ahora, intenta seleccionar una parte o un texto completo con el mouse; no puedes porque no funciona.

Sí, puedes seleccionar todo el texto con doble clic, pero no puedes deseleccionarlo después de eso. Además, ¿qué pasa si necesitas seleccionar solo una parte del texto para borrarlo?

Cuando el formulario es modal todo funciona bien.

La misma situación para Memo y supongo que para algunos otros controles de texto.

Todo esto lo necesito porque utilizamos un proyecto MDI serio y dentro de cada formulario MDI el usuario puede abrir diferentes formularios (por ejemplo, formulario de búsqueda). Por supuesto, podemos hacerlos modales, pero este no será el MDI real a partir de ese momento.

¿Alguna sugerencia, por favor?

Solución 3

Reemplazar Parent con MdiParent:

Form2 frm = new Form2();
frm.StartPosition = FormStartPosition.CenterParent;
frm.TopLevel = false;
frm.MdiParent = this;
frm.Show();
frm.BringToFront();

Y asegúrese de que su formulario principal tenga IsMdiContainer establecido en verdadero.

—————

No nos culpes por no explicar tu problema correctamente:
Si entendí bien por tus comentarios tienes 3 formas:
1- MainForm con IsMdiContainer establecido en verdadero
2- ChildForm con MdiParent ajustado a MainForm

3- AnotherChildForm. Y quieres que éste sea hijo de ChildForm.

Si esto es correcto, entonces no podrá deshacerse del error. Para eliminar el error ChildForm debiera ser ambos MdiContainer y MdiChild lo cual no es posible. Debes hacer que el tercer curso sea hijo de MainFormo no utilizar un formulario (tal vez un UserControl o algo).

Solución 1

En primer lugar, ¿qué intenta lograr estableciendo TopLevel a false? ¿Y por qué llamas? BringToFront()? Cuando crea un formulario sin modo, aparece automáticamente (se lleva al frente).

En segundo lugar, parece que no entiendes bien la naturaleza de una aplicación MDI, ni la interrelación entre las ventanas secundarias y otras formas.

En tercer lugar, si estás creando una ventana sin modo, deberías hacer algo como esto:

C#
public partial class MyForm
{
    MyModelessForm m_modelessForm = null;

    private void ShowModelessForm()
    {
        if (m_modelessForm == null)
        {
            m_modelessForm = new ModelessForm();
            // configure the form here if necessary
        }
        m_modelessForm.Show();
        m_modelessForm.BringToFront();
    }
}

Solución 2

Suponiendo que establezca la propiedad IsMdiContainer de Form1 a verdadero, su código debería leerse así:

Form2 frm2 = new Form2();
frm2.MdiParent = this;
frm2.Show();

Solución 4

Intente establecer la propiedad FormBorderStyle del formulario secundario en ‘ninguno’

コメント

タイトルとURLをコピーしました