Как увеличить размер textbox в visual studio
Пример 1:
Пример 2:
я создал потомка FixedTextBox , и попытался переопределить защищенный GetPreferredSize :
Мой переопределенный метод is называется, но TextBox не меняет свой «предпочтительный» размер.
я также пробовал переопределить защищенный DefaultSize имущество:
И он вызывается во время построения, но никогда не вызывается снова, если "размер по умолчанию" отличается (например, после того, как я изменил BorderStyle ) и не влияет на размер TextBox.
В чём правильный способ подключиться к инфраструктуре .NET WinForms "AutoSize", чтобы настроить "предпочтительный" размер?
Примечание: Просто потому, что я перебил GetPreferredSize не означает, что решение предполагает переопределение GetPreferredSize
ТЛ; др: Кто-то входит textBox1.Height += 1 и понять, почему он ничего не делает.
Связанные (но разные) вопросы
Упоминает о проблеме, принимая решения; в отличие от этого вопроса, который спрашивает, как использовать инфраструктуру «предпочтительного размера» в WinForms
Упоминает проблему, ищет решения, требующие пересчета TextBox его предпочтительной высоты; в отличие от этого вопроса, который допускает, что текстовое поле не может пересчитать свою предпочтительную высоту, и даже если бы это могло быть, это не помогло бы, потому что расчет автоматического размера неверен
3 ответы
"Control.GetPreferredSize вызывается контейнерами как часть цикла макета.
Это позволяет вызываемому элементу управления возвращать желаемый размер, если это возможно. Однако контейнер не должен соответствовать этому запрошенному размеру. Например, если для элемента управления для параметра Dock установлено значение Top, ширина будет определяться как ширина содержащего элемента управления независимо от значения, возвращаемого методом GetPreferredSize. Этот метод особенно полезен для контейнеров, таких как элемент управления компоновкой потока, который будет размещать каждый дочерний элемент управления один за другим ». [Фил Райт]
Это означает, что PreferredSize не изменит размер вашего TextBox.
Думаю, это решит вашу проблему:
ответ дан 23 мая '17, 13:05
Не существует "официального" правильного способа, поскольку такое поведение TextBox не задокументировано. Это действительно хитрый обходной путь, который я нашел методом проб и ошибок. Когда TextBox работает в многострочном режиме, его высоту можно изменить с помощью мыши в дизайнере или изменив ее в сетке свойств, а также, конечно, программно. Идея состоит в том, чтобы временно переключить текстовое поле в многострочный режим и изменить высоту. Само по себе это не работает, но если одновременно установить минимальный размер, то очевидно, что это так. - Оливье Жако-Декомб
Вы пробовали переопределить
или любого размера, который вам нужен
В зависимости от ваших целей, и то, что я делал в прошлом, заключалось в том, чтобы создать свои собственные подклассы для определенных элементов управления и переопределить такие вещи, как FontSize, FontName, Size и т. Д., И сделать их все доступными только для чтения (только применяя видимый извне "геттер"). Таким образом, любые экземпляры моего класса, которые были помещены в форму WinForms, которая имела сериализацию во время разработки, заставили бы меня избавиться от свойства «только для чтения» в дизайнере. После того, как это было сделано на ранней стадии разработки, с этими элементами управления больше никогда не возникало проблем. Если бы я когда-либо его изменил, форма получила бы новейшее значение / размер / шрифт в дизайнере без необходимости просматривать каждую форму и каждый экземпляр элемента управления.
Я обнаружил, что он хорошо работает с такими вещами, как текстовое поле, которое будет показывать только дату, или поля даты / времени, дополнительно применяемые к меткам, командным кнопкам и другим элементам «общего» назначения. Итак, во всем приложении это было похоже на применение каскадной таблицы стилей, но на уровне WinForms.
I'm writing a program where the user should be able to write text in a TextBox . I'd like the TextBox to resize itself, so it fits to the content. I've tried the following:
I get an error saying that Graphics doesn't work for TextChangedEventArgs . Is there another way I can resize the TextBox ?
10 Answers 10
You should try a code something like below. It has worked for me well.
For more information refer to TextRenderer.MeasureText()
I have usercontrol that has a TextBox inside. When Text grows much only the width will increase even the width will exceed from its parent. How determine the width of parent then wrap the text and increase the height?
I am adding this answer as I do not see the fixed width aspect of a textbox being discussed in any of the other. If you have a fixed width for your textbox, and you want to adjust only its height you can do something like the following:
Something like this gives the height of the text as how it is drawn in the multiline wordwrapped textbox itself:
I am not sure what StringFormat should be but the values StringFormatFlags do not seem to apply to a default TextBox make up.
Now with MessageSize.Height you know the height of the text in the textbox.
I had the same problem and I solved it in a simpler way.
I used the AutoSize property of a Label control.. I added an invisible label to my form, set its AutoSize property True. When the I need to change the size of my TextBox I use this code:
I set the Maximum and Minimum Size of the label for better results. Have Fun
Bam! Got it to work with the TextBox docked in a panel and the Label having its MaximumSize set off the resize of the container of the TextBox. ALSO, I set MyLabel.Text = MyTextBox.Text + " "; That way when you hit the 'Enter' key, the size of the label changes (It does not change the label size without a character after the CRLF). Thanks!
Your binding to the wrong event, and you cannot use the graphics object in the TextChangedEventArgs object.
Try using the TextChanged event. The following snippet is working:
You will need to use the CreateGraphics() method of the form to create the Graphics instance to measure the string on.
The TextChangedEventArgs class does not have a Graphics property, that is a property of the PaintEventArgs class passed in to the Paint event handler
Essentially you create your own Graphics object for the form, then measure it based on the text and font of the TextBox. The using will properly dispose the Graphics object - your previous code would have leaked horribly!
Whatever the aim is.
If the size of the textbox should be dynamically set up based on the string, which should be the text inside this box, there is no nice option.
Reasons : MeasureString uses usual string formatters as delimiters for its own width and height. Means, carriage return and line feed are parsed, too. Resulting in a sizeF.Width and sizeF.Height.
Depending on the string( and its font and number of lines ) these both variables can carry values, which are sometimes useless to be used as width/height values of a textbox ( because they can be bigger than the parentform's values and this would resize the textbox to a size, with left and bottom borders beyond those of the parent form).
Some solutions are still available, depending on the aim, one would like to achieve.
One idea would be : Create a textbox in designer, size = 100 X 100. enable word-wrapping.
In the OnTextChanged event handler of the textbox, we just resize the textbox's width to a value, defined by ourself (e.g. parentform.Width or another hard value ).
This would cause the word wrap to recalculate the string in the textbox and this would rearrange all the characters inside the textbox, because word wrap is enabled.
The height of the textbox could can be set hard to parentform.Height, for example.
BUT, better : set the height dynamically,based on the Y value of the ReturnValue (Point) of the method texbox.GetPositionFromCharIndex(textbox.TextLength -1 ). Then, with Math.Min() determine, which is smaller ( either parentform.Height or Point.Y ) , and reset the textbox size to new Size(previousDeterminedWidth, nowDeterminedHeight).
Please keep in mind ( if scrollbars are enabled ) to add about 17 pixs to Your width calculation.
I wanted to be able to change the single line text box height to fit a font size on it without using multi-line if possible.
21 Answers 21
Go into yourForm.Designer.cs Scroll down to your textbox. Example below is for textBox2 object. Add this
and set its size to whatever you want
Will work like a charm - without setting multiline to true, but only until you change any option in designer itself (you will have to set these 2 lines again). I think, this method is still better than multilining. I had a textbox for nickname in my app and with multiline, people sometimes accidentially wrote their names twice, like Thomas\nThomas (you saw only one in actual textbox line). With this solution, text is simply hiding to the left after each char too long for width, so its much safer for users, to put inputs.
No, because A/ it doesn't work if the textbox is docked B/ As pointed out, changing it in the designer breaks the fix
Changing the Designer file manually is generally not a good fix to anything. Almost always ends up getting clobbered later.
I can confirm Adam's answer and Franck's comment, AutoSize is indeed hidden from intellisense. If you type it up in full, it will be recognized as valid code. Try it, and then push Ctrl and click on AutoSize when underlined, you'll see the public override method in TextBoxBase (from metadata).
There are two ways to do this :
- Set the textbox's "multiline" property to true, in this case you don't want to do it so;
- Set a bigger font size to the textbox
I believe it is the only ways to do it; the bigger font size should automatically fit with the textbox
Why is this marked as the correct answer? Adam's answer of setting AutoSize = false and then set dimensions is the correct answer.
You can set the MinimumSize and/or the MaximumSize properties of the textbox. This does not affect the size immediately, but when you resize the textbox in the forms designer, the size will automatically be adjusted to satisfy the minimum/maximum size constraints. This works even when Multiline is set to false and does not depend on the font size.
I've found a quirk with this method - when placed inside of a container such as a cell of a TableLayoutPanel and you give it a Left-Right anchor, it doesn't vertically center correctly. Its vertical position seems to be calculated as though it were at its normal size.
@p0lar_bear: You could place the textbox on a panel with the right size as a workaround, and place this panel in the TableLayoutPanel cell.
@OlivierJacot-Descombes: True. It's my opinion, though, that if you're going to do something potentially messy like that, it'd be more manageable to just make it a multiline TextBox and suppress the Enter key, as suggested elsewhere on this page (though I know it's not what the OP was looking for - it works for me).
Another workaround would be to tweek the Margin property of the textbox or the Padding property of the container control.
set the minimum size property
This is working for me.
Just found a great little trick to setting a custom height to a textbox.
In the designer view, set the minimumSize to whatever you desire, and then completely remove the size setting. This will cause the designer to update with the new minimum settings!
Darn then! It was probably a bug they fixed. Though, if you want a larger textbox just alter the text size.
Try the following :)
- Set the textboxes to multiline
- Change the height
- Change the font size. (so it fit into the big textboxes)
- Set the textboxes back to non-multiline
This works great, even without changing the font size if you copy the size value to minimumSize before setting multiline back to false.
May be it´s a little late. But you can do this.
I solved it that way.
AutoSize, Minimum, Maximum does not give flexibility. Use multiline and handle the enter key event and suppress the keypress. Works great.
The text will still wrap automatically if the user enters too much text, so overriding enter isn't sufficient. Setting Multiline to true is definitely NOT the answer to this question no matter how many people post it as the correct solution. (If you actually want a multiline text box, it's a great solution.)
You can put it inside a panel that has the same back color with your desired height. This way has this advantage that the text box can center horizontally, which is not provided by other solutions.
You can make it even more natural by using the following methods
The Simplest Way to do that
- Right click on the TextBox.
- Go to properties.
- Set Multiline = True.
Now you will be able to resize the TextBox vertically as you wish.
for me, the best approach is remove border of the textbox, and place it inside a Panel, which can be customized as you like.
But it doesn't solve the problem. It makes the border look right, but the text still gets clipped at larger font sizes.
The following code added in your constructor after calling InitializeComponent() will make it possible to programmatically set your text box to the correct height without a) changing the Multiline property, b) having to hardcode a height, or c) mucking with the Designer-generated code. It still isn't necessarily as clean or nice as doing it in a custom control, but it's fairly simple and robust:
I decided to make it cleaner and easier to use by putting it in a static class and make it an extension method on TextBox:
Some of you were close but changing designer code like that is annoying because you always have to go back and change it again.
This is the problem I faced when placing textboxes next to comboboxes on a form. This is a bit irritating because who wants two controls side-by-side with different heights? Or different fonts to force heights? Step it up Microsoft, this should be simple!
In the form load event (or anywhere as long as fired after InitializeComponent ): textbox.AutoSize = false Then set the height to whatever you want. For me I wanted my text boxes and combo boxes to be the same height so textbox.height = combobox.height did the trick for me.
1) The designer will not be affected so it will require you to start your project to see the end result, so there may be some trial and error.
2) Align the tops of your comboboxes and textboxes if you want them to be aligned properly after the resize because the textboxes will grow down.
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
Растянуть элементы на форме Windows Forms
В статье рассмотрим способ создания «резинового» интерфейса в формах Windows Forms и разберёмся, как растянуть элементы на форме при изменении размера окна программы.
Создадим в Visual Studio проект Windows Forms и разместим на форме следующие элементы управления:
Запустим программу и с помощью мыши попробуем увеличить размеры окна, потянув правый нижний угол формы. В результате получим следующее:
Видим, что окно формы увеличилось в размере, но элементы управления никак не реагируют на данные изменения.
Теперь покажем, как создать адаптивный к изменениям размера окна интерфейс на форме Windows Forms.
Как растянуть элементы на форме Windows Forms
Для создания «резинового» интерфейса нужно воспользоваться свойствами элементов управления из категории Макет (Layout). А конкретно свойством Anchor.
В Windows Forms свойство Anchor определяет стороны контейнера (Top, Bottom, Left, Right) к которым привязывается элемент управления. При изменении размера контейнера расстояние между указанной стороной контейнера и ближайшей к ней стороне элемента управления остаётся неизменным.
Таким образом можно добиться растягивания и перемещения элементов в форме при изменении её размера.
В нашем случае контейнером для элементов управления является всё окно.
Зададим для TextBox значение атрибута Anchor = Top, Left, Right. Теперь расстояние между соответствующими сторонами ТекстБокса и окна будет неизменным. Так мы добьёмся изменения ширины контрола при изменении ширины окна.
Для RichTextBox значение свойства Anchor сделаем равным Top, Bottom, Left, Right.
У кнопки Button установим Anchor, как Top, Right.
Теперь запустим программу и изменим размер окна: увидим, что элементы управления на форме растягиваются и меняют своё местоположение. Теперь интерфейс стал адаптированным к изменению размера окна.
Есть ещё один момент. Когда мы будем уменьшать мышью размер формы — контролы будут скрываться из поля зрения.
Чтобы решить данную проблему, необходимо указать минимальный размер формы Windows Form в пикселях. Тем самым форму будет невозможно сделать меньше установленного размера.
Щёлкнем по форме и в окне свойств изменим параметр MinimunSize. Установим его равным текущему размеру формы в визуальном редакторе (Size).
Минимальный размер можно указать и меньшим — таким, при котором интерфейс хорошо выглядит и сохраняет свою функциональность. Нужные значения определяются экспериментально — для этого самостоятельно изменяйте размер формы.
Я хотел иметь возможность изменять высоту текстового окна одной строки, чтобы он соответствовал размеру шрифта, без возможности использования многострочной линии.
ОТВЕТЫ
Ответ 1
Есть два способа сделать это:
- Установите для текстового поля "многострочное" свойство значение true, в этом случае вы не хотите этого делать,
- Установите размер шрифта большего размера в текстовое поле
Я считаю, что это единственный способ сделать это; больший размер шрифта должен автоматически вписываться в текстовое поле
Ответ 2
Войдите в свой файл .Designer.cs Прокрутите вниз до текстового поля. Пример ниже для объекта textBox2. Добавьте это
и установите его размер как угодно
Будет работать как шарм - без установки многострочного значения в true, но только до тех пор, пока вы не измените какой-либо параметр в самом дизайне (вам придется снова установить эти две строки). Я думаю, этот метод все же лучше, чем мультилиния. У меня было текстовое поле для псевдонима в моем приложении и с многострочным, люди иногда случайно записывали свои имена дважды, например, Thomas\nThomas (вы видели только одну в реальной строке текстового поля). С помощью этого решения текст просто скрывается слева после того, как каждый char слишком длинный для ширины, поэтому его намного безопаснее для пользователей, для ввода входов.
Ответ 3
Вы можете установить свойства MinimumSize и/или MaximumSize текстового поля. Это не влияет на размер сразу, но при изменении размера текстового поля в дизайнере форм размер автоматически настраивается для удовлетворения ограничений минимального/максимального размера. Это работает даже тогда, когда Multiline установлен на false и не зависит от размера шрифта.
Ответ 4
задайте свойство минимального размера
Это работает для меня.
Ответ 5
Просто нашел отличный трюк для установки пользовательской высоты в текстовое поле.
В представлении конструктора установите minimumSize по своему желанию, а затем полностью удалите параметр size . Это заставит дизайнера обновиться с новыми минимальными настройками!
Ответ 6
Ответ 7
Ответ 8
Может быть, немного поздно. Но вы можете это сделать.
Я решил это так.
Ответ 9
AutoSize, Minimum, Maximum не дает гибкости. Используйте multiline и обрабатывайте событие ввода ключа и подавляйте нажатие клавиши. Отлично работает.
Ответ 10
для меня лучший подход - удалить границу текстового поля и поместить его внутри панели, которая может быть настроена по своему усмотрению.
Ответ 11
Следующий код, добавленный в ваш конструктор после вызова InitializeComponent(), позволит программно установить ваше текстовое поле на нужную высоту без а) изменения свойства Multiline, b) для жесткого кодирования высоты или c) код, созданный конструктором. Он по-прежнему не обязательно такой же чистый или приятный, как это делается в пользовательском элементе управления, но он довольно прост и прочен:
Я решил сделать его более чистым и простым в использовании, поставив его в статический класс и сделав его методом расширения в TextBox:
Ответ 12
Вы можете поместить его внутри панели, имеющей тот же задний цвет с нужной высотой. Таким образом, это преимущество заключается в том, что текстовое поле может располагаться горизонтально, что не обеспечивается другими решениями.
Вы можете сделать это еще более естественным, используя следующие методы
Ответ 13
Некоторые из вас были близки, но изменение кода дизайнера, как это раздражает, потому что вам всегда нужно вернуться и изменить его снова.
Это проблема, с которой я столкнулся при размещении текстовых полей рядом со списками в форме. Это немного раздражает, потому что кто хочет, чтобы два элемента управления были бок о бок с разной высотой? Или разные шрифты, чтобы заставить высоты? Постарайся Microsoft, это должно быть просто!
В форме load event (или в любом месте до тех пор, пока он запускается после InitializeComponent ): textbox.AutoSize = false Затем установите высоту в соответствии с тем, что вы хотите. Для меня я хотел, чтобы мои текстовые поля и комбинированные поля были одинаковой высоты, поэтому textbox.height = combobox.height помогло.
1) Дизайнер не будет затронут, поэтому вам потребуется начать проект, чтобы увидеть конечный результат, поэтому могут быть некоторые пробные версии и ошибки.
2) Выровняйте вершины ваших списков и текстовых полей, если вы хотите, чтобы они были правильно выровнены после изменения размера, потому что текстовые поля будут уменьшаться.
Ответ 14
- Установите текстовые поля в многострочные
- Изменить высоту
- Измените размер шрифта. (поэтому он вписывается в большие текстовые поля)
- Установите текстовые поля обратно в не-многострочные
Ответ 15
Это то, что отлично работало для меня, поскольку все, что я хотел сделать, это установить высоту текстового поля. Свойство доступно только для чтения, а свойство находится в классе Unit, поэтому вы не можете просто установить его. Поэтому я просто создал новое подразделение, и конструктор позволяет мне установить высоту, а затем установить текстовое поле для этого устройства.
Ответ 16
Самый простой способ сделать это
1.. щелкните правой кнопкой мыши на текстовом поле
2.. перейти к собственности
Теперь сделано это автоматически изменит размер TextBox
и вы также можете настроить это
Ответ 17
Все, что вам нужно сделать, это включить мультилинию в окне свойств, указать желаемый размер в этом же окне, а затем в .cs после InitializeComponent, положить txtexample.Multiline = false; и поэтому многострочный не включен, но размер текста, как вы сказали.
Ответ 18
Вы также можете изменить вы также можете изменить MinimumSize
Ответ 19
Таким образом, после того, как у меня возникла та же проблема с невозможностью отрегулировать высоту в текстовом поле, настройка ширины - это хорошо, но высота никогда не корректировалась с помощью приведенных выше предложений (по крайней мере, для меня), и я наконец смог сделать это. Как упоминалось выше, проблема, по-видимому, связана с настройкой размера шрифта по умолчанию в моем текстовом поле и поведением автоматического изменения размера текстового поля вокруг него. Размер шрифта по умолчанию был крошечный. Следовательно, попытка форсировать высоту или даже отключить авторазмер не смогла решить проблему для меня.
Установите свойства шрифта в соответствии с размером, который вам нравится, и тогда изменение высоты будет автоматически соответствовать размеру шрифта. Вы все еще можете вручную установить ширину текстового поля. Ниже приведен фрагмент, который я добавил, который работал для меня.
Обратите внимание, что значение высоты в '$ textBox.Size = New-Object System.Drawing.Size(600, 80)' игнорируется, и размер шрифта фактически контролирует высоту текстового поля, автоматически изменяя размер шрифта.
Ответ 20
Я думаю, что это должно сработать.
Ответ 21
Я знаю, что это своего рода старый пост, но я оказался в этой же проблеме, и, немного выяснив, что высота текстового поля WinForms фактически вычисляется в зависимости от размера шрифта, который он содержит, это просто не совсем равно.
Этот парень объясняет, как выполняется вычисление, и как вы можете установить его в TextBox, чтобы получить желаемую высоту.
Читайте также: