Авторазмер текстового элемента управления по вертикали - PullRequest
14 голосов
/ 23 мая 2010

В форме C # у меня есть панель, закрепленная со всех сторон, а внутри текстовое поле, закрепленное сверху / слева / справа.

Когда текст загружается в текстовое поле, я хочу, чтобы он автоматически расширялся по вертикали, чтобы мне не нужно было прокручивать текстовое поле (максимально прокрутите панель, если есть больше текста, который не помещается на панели) , Есть ли способ сделать это с помощью текстового поля? (я не обязан использовать этот элемент управления, поэтому, если есть другой элемент управления, который соответствует описанию, не стесняйтесь упоминать его)

Ответы [ 6 ]

27 голосов
/ 19 января 2012

Текущий выбранный ответ НЕ обрабатывает строки без пробелов, такие как «jjjjjjjjjjjjjjjjjjjj» x1000 (подумайте о том, что произойдет, если кто-то вставит URL-адрес)

Этот код решает эту проблему:

private void txtBody_TextChanged(object sender, EventArgs e)
{
    // amount of padding to add
    const int padding = 3;
    // get number of lines (first line is 0, so add 1)
    int numLines = this.txtBody.GetLineFromCharIndex(this.txtBody.TextLength) + 1;
    // get border thickness
    int border = this.txtBody.Height - this.txtBody.ClientSize.Height;
    // set height (height of one line * number of lines + spacing)
    this.txtBody.Height = this.txtBody.Font.Height * numLines + padding + border;
}
25 голосов
/ 24 мая 2010

Я предполагаю, что это многострочное текстовое поле, и вы позволите ему расти вертикально. Этот код работал хорошо:

    private void textBox1_TextChanged(object sender, EventArgs e) {
        Size sz = new Size(textBox1.ClientSize.Width, int.MaxValue);
        TextFormatFlags flags = TextFormatFlags.WordBreak;
        int padding = 3;
        int borders = textBox1.Height - textBox1.ClientSize.Height;
        sz = TextRenderer.MeasureText(textBox1.Text, textBox1.Font, sz, flags);
        int h = sz.Height + borders + padding;
        if (textBox1.Top + h > this.ClientSize.Height - 10) {
            h = this.ClientSize.Height - 10 - textBox1.Top;
        }
        textBox1.Height = h;
    }

Вы должны сделать что-то разумное, когда текстовое поле пусто, например, установить свойство MinimumSize.

2 голосов
/ 23 мая 2010

Я бы предложил использовать Graphics.MeasureString.

Сначала вы создаете объект Graphics, затем вызываете MeasureString для него, передавая строку и шрифт текстового поля.

Пример

string text = "TestingTesting\nTestingTesting\nTestingTesting\nTestingTesting\n";

// Create the graphics object.
using (Graphics g = textBox.CreateGraphics()) {        
    // Set the control's size to the string's size.
    textBox.Size = g.MeasureString(text, textBox.Font).ToSize(); 
    textBox.Text = text;
}

Вы также можете ограничить его вертикальной осью, установив только свойство textBox.Size.Height и используя перегрузку MeasureString, которая также принимает int width.

Редактировать

Как указал SLaks, другой вариант использует TextRenderer.MeasureString. Таким образом, нет необходимости создавать Graphics объект.

textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize(); 

Здесь вы можете ограничиться вертикальным изменением размеров, используя технику Ганса, передав дополнительный параметр Size в MeasureString с int.MaxValue высотой.

2 голосов
/ 23 мая 2010

Вы можете использовать метку и установить AutoSize на true.

0 голосов
/ 30 апреля 2015

Попробуйте этот подход:

код aspx.cs

protected int GetRows(object value) {
        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
            return 1;

        var contentTrimmed = value.ToString().Replace('\t', ' ').Replace('\r', ' ').Replace('\n', ' ').Trim();

        var length = (decimal)contentTrimmed.Length;
        if (length == 0)
            return 1;

        int res = 0;
        decimal maxLength = 56;
        using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(new Bitmap(1, 1)))
        {
             SizeF sizeRef = graphics.MeasureString("W", new Font("Segoe UI", 13, FontStyle.Regular, GraphicsUnit.Pixel));
             maxLength = maxLength * (decimal)sizeRef.Width;

             SizeF size = graphics.MeasureString(contentTrimmed, new Font("Segoe UI", 13, FontStyle.Regular, GraphicsUnit.Pixel));
             length = (decimal)size.Width;
        }

        res = (int)Math.Round(length / (decimal)maxLength, MidpointRounding.AwayFromZero);
        if (res == 0)
            return 1;

        return res;
 }

код aspx

<asp:TextBox ID="txtValue" TextMode="MultiLine" Text='<%# Eval("Value") %>' runat="server" MaxLength="500" Width="700px" Rows='<%# GetRows(Eval ("Value")) %>' ></asp:TextBox>
0 голосов
/ 23 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...