none
TextBox automatisch vergrößern RRS feed

  • Frage

  • Hallo,

    ich suche die Möglichkeit eine TextBox oder RichTextBox automatisch beim schreiben anzupassen.

    Das heißt Sie soll eine Mindestgröße haben, wenn ich über diese Mindestgröße komme soll sie länger werden. Wenn ich Enter drücke solls sie nach unten größer werden, so dass die beiden Zeilen dann sichtbar sind, dann nochmal Enter dann wären es 3 sichtbare Zeilen usw...

            private void txtbox_Click(object sender, EventArgs e)
            {
                System.Windows.Forms.TextBox pb = new TextBox();
                pb.Top = 60;
                pb.Left = 150;
                pb.BackColor = Color.Yellow;
                pb.KeyDown += DynObject_Tasten;
                pb.MouseMove += this.TextBox1_MouseMove;
                this.Controls.Add(pb);
                pb.BringToFront();
            }

    Mein momentaner Code um die TextBox zu generieren und auf Tastendruck einzufügen.

    Danke im Vorraus!

    Freitag, 6. April 2012 11:18

Antworten

  • Das machst du am Besten wenn du eine abgeleitete Klasse definierst und
    deren Methoden überschreibst. Mein Beispiel ist sicher noch zu
    verfeinern aber zur Anschauung tut es. Ich fange das TextChanged Event
    ab. In der Hauptform:
     
    [code]
    private void button1_Click(object sender, EventArgs e)
    {
        System.Windows.Forms.TextBox dynBox = new DynamicBox(30, 20);
        dynBox.Top = button1.Top;
        dynBox.Left = 10;
        this.Controls.Add(dynBox);
        dynBox.BringToFront();
        dynBox.Focus();
    }
    [/code]
     
    Dann fügst du dem Projekt eine neue Datei hinzu (bei mir DynamicBox.cs),
    wo folgendes drinsteht:
     
    [code]
    using System;
    using System.Windows.Forms;
    using System.Drawing;
     
    namespace WindowsFormsApplication1
    {
        class DynamicBox : TextBox
        {
            int minWidth, minHeight;
             public DynamicBox(int width, int height)
            {
                this.Width = minWidth = width;
                this.Height = minHeight = height;
                this.TextChanged += new
    System.EventHandler(this.OnTextChanged);
                this.Multiline = true;
                this.WordWrap = false;
            }
             private void OnTextChanged(object sender, EventArgs e)
            {
                int nLines;
                int maxLen = 0;
                int hotIndex = 0;
                 if ((nLines = this.Lines.Length) == 0)
                    return;
                 for (int i = 0; i < nLines; i++)
                {
                    if (this.Lines[i].Length > maxLen)
                    {
                        hotIndex = i;
                        maxLen = this.Lines[i].Length;
                    }
                }
                Graphics gr = this.CreateGraphics();
                Size sz = gr.MeasureString(this.Lines[hotIndex],
    this.Font).ToSize();
                this.Width = (sz.Width > minWidth ? sz.Width : minWidth) + 2;
                int totalHeight = sz.Height * (nLines + 1);
                this.Height = (totalHeight > minHeight ? totalHeight :
    minHeight);
            }
        }
    }
    [/code]
     
    Hajü
     
     
    Freitag, 6. April 2012 19:19

Alle Antworten

  • Das machst du am Besten wenn du eine abgeleitete Klasse definierst und
    deren Methoden überschreibst. Mein Beispiel ist sicher noch zu
    verfeinern aber zur Anschauung tut es. Ich fange das TextChanged Event
    ab. In der Hauptform:
     
    [code]
    private void button1_Click(object sender, EventArgs e)
    {
        System.Windows.Forms.TextBox dynBox = new DynamicBox(30, 20);
        dynBox.Top = button1.Top;
        dynBox.Left = 10;
        this.Controls.Add(dynBox);
        dynBox.BringToFront();
        dynBox.Focus();
    }
    [/code]
     
    Dann fügst du dem Projekt eine neue Datei hinzu (bei mir DynamicBox.cs),
    wo folgendes drinsteht:
     
    [code]
    using System;
    using System.Windows.Forms;
    using System.Drawing;
     
    namespace WindowsFormsApplication1
    {
        class DynamicBox : TextBox
        {
            int minWidth, minHeight;
             public DynamicBox(int width, int height)
            {
                this.Width = minWidth = width;
                this.Height = minHeight = height;
                this.TextChanged += new
    System.EventHandler(this.OnTextChanged);
                this.Multiline = true;
                this.WordWrap = false;
            }
             private void OnTextChanged(object sender, EventArgs e)
            {
                int nLines;
                int maxLen = 0;
                int hotIndex = 0;
                 if ((nLines = this.Lines.Length) == 0)
                    return;
                 for (int i = 0; i < nLines; i++)
                {
                    if (this.Lines[i].Length > maxLen)
                    {
                        hotIndex = i;
                        maxLen = this.Lines[i].Length;
                    }
                }
                Graphics gr = this.CreateGraphics();
                Size sz = gr.MeasureString(this.Lines[hotIndex],
    this.Font).ToSize();
                this.Width = (sz.Width > minWidth ? sz.Width : minWidth) + 2;
                int totalHeight = sz.Height * (nLines + 1);
                this.Height = (totalHeight > minHeight ? totalHeight :
    minHeight);
            }
        }
    }
    [/code]
     
    Hajü
     
     
    Freitag, 6. April 2012 19:19
  • Ein Funktionsaufruf ist überflüssig:
     
    // dynBox.BringToFront();
     
    Hajü
     
    Freitag, 6. April 2012 23:26
  • Hallo germanman,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 27. April 2012 07:26
    Moderator