Если вы используете рекурсию, вы можете вернуть свойства объекта любой глубины -
function lookdeep(object){
var collection= [], index= 0, next, item;
for(item in object){
if(object.hasOwnProperty(item)){
next= object[item];
if(typeof next== 'object' && next!= null){
collection[index++]= item +
':{ '+ lookdeep(next).join(', ')+'}';
}
else collection[index++]= [item+':'+String(next)];
}
}
return collection;
}
//example
var O={
a:1, b:2, c:{
c1:3, c2:4, c3:{
t:true, f:false
}
},
d:11
};
var lookdeepSample= 'O={'+ lookdeep(O).join(',\n')+'}';
/* returned value: (String)
O={
a:1,
b:2,
c:{
c1:3, c2:4, c3:{
t:true, f:false
}
},
d:11
}
*/
Я предполагаю, что это многострочное текстовое поле, и вы позволяете ему расти вертикально. Этот код работал хорошо:
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.
Текущий выбранный ответ НЕ обрабатывает строки без пробелов, таких как «jjjjjjjjjjjjjjjjjjj» 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;
}
Я бы предложил использовать 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
.
Редактировать
Как указал Слэкс, другая опция использует TextRenderer.MeasureString
. Таким образом, нет необходимости создавать объект Graphics
.
textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize();
Здесь вы можете ограничить вертикальное изменение размера с помощью техники Ганса, передав дополнительный параметр Size
в MeasureString
с int.MaxValue
высота.
Вы можете привязать его к нижней части, что обеспечит изменение размера текстового поля по вертикали, когда будет изменена форма, к которой она принадлежит. Кроме того, текстовое поле, которое меняет свой размер, может быть не изящным, поскольку оно может нарушить способ отображения других компонентов. Почему бы вам не указать максимальный размер, а не изменить его?
Попробуйте этот подход:
aspx.cs code
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>
Вы можете использовать Label и установить AutoSize на true
.