4 votes

Création d'une interface utilisateur dynamique dans winforms

Si je veux créer un winform avec des contrôles d'interface utilisateur dynamiques qui apparaissent, quelle est la meilleure façon de le faire ?

J'ai un formulaire avec une zone de texte, un bouton 1 à sa droite, une zone de liste en dessous, et un bouton 2 en dessous de la zone de liste. Le fait d'appuyer sur le bouton 1 devrait générer une autre zone de texte sous la première zone de texte et la zone de liste/bouton 2 devrait être déplacée vers le bas. Si vous avez déjà utilisé Adobe Bridge, la fenêtre de renommage par lots est un exemple de ce dont je parle.

Je pensais simplement ajouter textboxN.Height à this.Size entonces textboxN.Height à la position Y de chacun des contrôles (sauf la première boîte de texte) afin qu'ils soient tous décalés vers le bas de textboxN.Height pixels. Mais je pense qu'il y a un meilleur moyen de le faire. Est-ce que Winforms convient plutôt à quelque chose comme ça ?

3voto

Kristian Fenn Points 847

Vous pourriez simplement ajouter la hauteur de la TextBox à la taille du formulaire, mais il serait préférable d'utiliser une constante qui détermine la taille des TextBox, puis de l'ajouter.

Pour déplacer la listBox/bouton2, ancrez-les au bas du formulaire, et ils resteront automatiquement à la même distance du bas du formulaire.

Pour ce qui est de la génération dynamique, utilisez une liste (ou une pile, selon l'usage que vous en faites).

partial class Form1 : Form
{
    List<TextBox> textBoxes = new List<TextBox>(); // or stack
    const int textBoxWidth = 200;  // control variables for TextBox placement
    const int textBoxHeight = 50;
    const int textBoxMargin = 5;

    void button1_Click(object sender, EventArgs e)
    {
        this.Height += textBoxHeight + textBoxMargin;
        TextBox tb = new TextBox();

        if (textBoxes.Count == 0)
        {
            tb.Top = textBoxMargin;
        }
        else
        {
            tb.Top = ((textBoxHeight + textBoxMargin) * textBoxes.Count) + textBoxMargin;
        }

        tb.Left = textBoxMargin;
        tb.Height = textBoxHeight;
        tb.Width = textBoxWidth;
        textBoxes.Add(tb);
        this.Controls.Add(tb);
    }
}

Cela devrait fonctionner. Le problème avec cette méthode, c'est que presque toute la personnalisation du placement peut être faite avec les valeurs constantes.

Est-il préférable de le faire dans WinForms ? Eh bien, il n'y a certainement aucune raison réelle de ne pas le faire dans WinForms, cette fonctionnalité est assez facile à mettre en œuvre. Je suis moi-même un gars de WPF, mais c'est toujours légitime.

Modifié pour les erreurs de logique

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X