Les contrôles de texte ne permettent pas de sélectionner le texte avec la souris lorsque TopLevel = false

la programmation


Salut tout le monde!

J’ai un problème avec les TextBox dans mon formulaire.

Capture d’écran comme image http://rghost.ru/5011999/image.png

Montrons la situation sur un exemple simple.

1) Créez un nouveau projet Winforms avec Form1 ;
2) Créez un nouveau Form2, placez-y le contrôle TextBox ;
3) Écrivons du code simple qui crée le formulaire non modal ;

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

Une fois que vous avez exécuté ce code, le formulaire avec la zone de texte apparaîtra.
Tapez quelque chose dans la zone de texte, par exemple « ceci est un test ». Maintenant, essayez de sélectionner une partie ou un texte entier avec la souris – vous ne pouvez pas, car cela ne fonctionne pas.

Oui, vous pouvez sélectionner tout le texte en double-cliquant, mais vous ne pouvez plus le désélectionner après cela. D’ailleurs, que se passe-t-il si vous devez sélectionner seulement une partie du texte pour l’effacer ?!

Lorsque le formulaire est modal, tout fonctionne bien.

La même situation pour Memo et je suppose pour certains autres contrôles de texte.

Tout cela dont j’ai besoin parce que nous utilisons un projet MDI sérieux, et à l’intérieur de chaque formulaire MDI, l’utilisateur peut ouvrir différents formulaires (par exemple, un formulaire de recherche). Bien sûr, nous pouvons les rendre modaux, mais ce ne sera plus le véritable MDI à partir de ce moment-là.

Des suggestions, s’il vous plaît ?

Solution 3

Remplacer Parent avec MdiParent:

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

Et assurez-vous que votre formulaire principal contient IsMdiContainer défini sur vrai.

—————

Ne nous blâmez pas parce que vous n’avez pas correctement expliqué votre problème :
Si j’ai bien compris de vos commentaires vous avez 3 formulaires :
1- MainForm avec IsMdiContainer défini sur vrai
2- ChildForm avec MdiParent mis à MainForm

3- AnotherChildForm. Et tu veux que celui-ci soit un enfant de ChildForm.

Si cela est correct, vous ne pouvez pas vous débarrasser du bug. Pour supprimer le bug ChildForm devrait être les deux MdiContainer et MdiChild ce qui n’est pas possible. Vous devez soit faire de la 3ème forme un enfant de MainFormou ne pas utiliser de formulaire (peut-être un UserControl ou quelque chose).

Solution 1

Tout d’abord, qu’essayez-vous d’accomplir en définissant TopLevel à false? Et pourquoi appelles-tu BringToFront()? Lorsque vous créez un formulaire non modal, il apparaît automatiquement (il est mis au premier plan).

Deuxièmement, il semble que vous ne compreniez pas très bien la nature d’une application MDI, ni les relations entre les fenêtres enfants et les autres formulaires.

Troisièmement, si vous créez une fenêtre non modale, cela devrait ressembler à ceci :

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();
    }
}

Solution 2

En supposant que vous définissez la propriété IsMdiContainer de Form1 à true, votre code devrait se lire comme ceci :

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

Solution 4

Essayez de définir la propriété FormBorderStyle du formulaire enfant sur « aucun »

コメント

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