各位大哥,怎么能让 Label 不还行呢?(C# WinForm) Label 的长度不是 自动调整的,如果内容太多的话后面就不要显示了!怎样能做到!? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你直接拖个label就是你要的效果阿。如果不是,你将label的AutoSize 设置为false 我想楼上的理解可能错了。搂主应该是想让Label的内容不自动换行,而不是自动改变大小。不过好像在Label成员中并没有直接提供禁止自动换行和maxlength的属性。如果想控制的,只能通过脚本了。首先计算label能显示的length,然后截取这部分显示出来。可以用substring 等函数。 可以用 Label.PreferredWidth 属性来计算文本的宽度,再与 Label.Width 属性比较来决定 Label.Text 要取多长。 获得Label显示的宽度,然后自己截取字符串长度好了 // 使用 Skyiv.Label 可以达到多于一行的内容自动截断的效果namespace Skyiv{ class Label : System.Windows.Forms.Label { public Label() { BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; // 为了说明标签的边界, 使用单线边框, 正式使用时可把该行去掉. TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // System.Windows.Forms.Label的默认值是TopLeft. } protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { int charactersFitted, linesFilled; System.Drawing.SizeF sizef = new System.Drawing.SizeF(Width, FontHeight); System.Drawing.StringFormat stringf = new System.Drawing.StringFormat(); e.Graphics.MeasureString(Text, Font, sizef, stringf, out charactersFitted, out linesFilled); Text = Text.Substring(0, charactersFitted); base.OnPaint(e); } }}namespace Test{ using MyLabel = Skyiv.Label; using System.Windows.Forms; using System.Drawing; class Test : Form { Test() { MyLabel label1 = new MyLabel(); label1.Parent = this; label1.Text = "测试字符串,很长的!还不够长?"; label1.Width = 120; label1.Height = 60; MyLabel label2 = new MyLabel(); label2.Parent = this; label2.Top = 65; label2.Width = 50; label2.Height = 20; MyLabel label3 = new MyLabel(); label3.Parent = this; label3.Top = 90; label3.Width = 155; label3.Height = 75; label3.Text = "测试字符串,很长的!还不够长?那就再来!"; label3.TextAlign = ContentAlignment.BottomRight; } static void Main() { Application.Run(new Test()); } }} // Skyiv.Windows.Forms.Label 控件, 实现了 LineLimit、Wrap 属性namespace Skyiv.Windows.Forms{ using System.Drawing; class Label : System.Windows.Forms.Label { // 以下3个字段也可以用属性实现 public new string Text = string.Empty; // 文本 public bool LineLimit = false; // 是否仅显示完整的文本行 public bool Wrap = true; // 文本是否自动换行 // 重绘控件 protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { int chars, lines; SizeF size = new SizeF(Width, Height); StringFormatFlags sff = 0; if (LineLimit) sff |= StringFormatFlags.LineLimit; if (!Wrap) sff |= StringFormatFlags.NoWrap; StringFormat sf = new StringFormat(sff); e.Graphics.MeasureString(Text, Font, size, sf, out chars, out lines); base.Text = Text.Substring(0, chars); base.OnPaint(e); } }}// 测试namespace Skyiv.Test{ using Label = Skyiv.Windows.Forms.Label; using System.Windows.Forms; class Test : Form { Test() { Text = "测试字符串,很长的! 不够长? 那就再来!"; Label label1 = new Label(); label1.Parent = this; label1.Text = Text; label1.Width = 100; label1.Height = 38; Label label2 = new Label(); label2.Parent = this; label2.Text = Text; label2.Top = 40; label2.Width = 100; label2.Height = 38; label2.LineLimit = true; // 仅显示完整的文本行 Label label3 = new Label(); label3.Parent = this; label3.Text = Text; label3.Top = 80; label3.Width = 100; label3.Height = 38; label3.Wrap = false; // 文本不自动换行 foreach (Control ctl in Controls) { if (ctl is System.Windows.Forms.Label) { ((System.Windows.Forms.Label)ctl).BorderStyle = BorderStyle.FixedSingle; } } } static void Main() { Application.Run(new Test()); } }} // Skyiv.Windows.Forms.Label 控件, 实现了 LineLimit、Wrap 属性// SLabel.cs (C) air|skyiv.com Fri 2005.07.29namespace Skyiv.Windows.Forms{ using System.Drawing; class Label : System.Windows.Forms.Label { public new string Text = string.Empty; // 文本 public bool LineLimit = false; // 是否仅显示完整的文本行 public bool Wrap = true; // 文本是否自动换行 private string DisplayText(Graphics g) { StringFormat sf = new StringFormat(); if (LineLimit) sf.FormatFlags |= StringFormatFlags.LineLimit; if (!Wrap) sf.FormatFlags |= StringFormatFlags.NoWrap; switch (TextAlign) { case ContentAlignment.TopLeft : sf.LineAlignment = StringAlignment.Near ; sf.Alignment = StringAlignment.Near ; break; case ContentAlignment.TopCenter : sf.LineAlignment = StringAlignment.Near ; sf.Alignment = StringAlignment.Center; break; case ContentAlignment.TopRight : sf.LineAlignment = StringAlignment.Near ; sf.Alignment = StringAlignment.Far ; break; case ContentAlignment.MiddleLeft : sf.LineAlignment = StringAlignment.Center; sf.Alignment = StringAlignment.Near ; break; case ContentAlignment.MiddleCenter : sf.LineAlignment = StringAlignment.Center; sf.Alignment = StringAlignment.Center; break; case ContentAlignment.MiddleRight : sf.LineAlignment = StringAlignment.Center; sf.Alignment = StringAlignment.Far ; break; case ContentAlignment.BottomLeft : sf.LineAlignment = StringAlignment.Far ; sf.Alignment = StringAlignment.Near ; break; case ContentAlignment.BottomCenter : sf.LineAlignment = StringAlignment.Far ; sf.Alignment = StringAlignment.Center; break; case ContentAlignment.BottomRight : sf.LineAlignment = StringAlignment.Far ; sf.Alignment = StringAlignment.Far ; break; } int chars, lines; g.MeasureString(Text, Font, ClientSize, sf, out chars, out lines); return Text.Substring(0, chars); } protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { base.Text = (Wrap && !LineLimit) ? Text : DisplayText(e.Graphics); base.OnPaint(e); } }} cliff1002(不得不) 理解的是对的!可是汉字和英文字母 所占的像素不一样?我怎么判断字符长度和label的宽度!? label纵向宽度调小一点就看不出换行拉 wuyi8808(air|skyiv.com)的代码很好啊,学习中!!! 哥们,自己重写一个Label吧!!!! 范性转换的问题 在VS中 有Button 一个透明按钮怎么做 数据集右键添加Relation(r)出现乱码,是怎么回事 关于c#调用dll后内存释放的问题 请教c#关于获得层数据的问题 C# WebService 问题(在线急等) SQLS数据库如何查询三张表里相同ID的记录到一张表里,无值填0 0 0 麻烦看看这段简单的代码 关于1个从视图中获取记录 并保存入 某表的SQL语句问题,在线等 谢谢 如何修改窗体的外观? window系统中的缩略图列表是怎么做的? vc有openGL,c#有什么能和他匹敌呢?
如果不是,你将label的AutoSize 设置为false
搂主应该是想让Label的内容不自动换行,而不是自动改变大小。不过好像在Label成员中并没有直接提供禁止自动换行和maxlength的属性。
如果想控制的,只能通过脚本了。首先计算label能显示的length,然后截取这部分显示出来。
可以用substring 等函数。
namespace Skyiv
{
class Label : System.Windows.Forms.Label
{
public Label()
{
BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; // 为了说明标签的边界, 使用单线边框, 正式使用时可把该行去掉.
TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // System.Windows.Forms.Label的默认值是TopLeft.
} protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
int charactersFitted, linesFilled;
System.Drawing.SizeF sizef = new System.Drawing.SizeF(Width, FontHeight);
System.Drawing.StringFormat stringf = new System.Drawing.StringFormat();
e.Graphics.MeasureString(Text, Font, sizef, stringf, out charactersFitted, out linesFilled);
Text = Text.Substring(0, charactersFitted);
base.OnPaint(e);
}
}
}namespace Test
{
using MyLabel = Skyiv.Label;
using System.Windows.Forms;
using System.Drawing;
class Test : Form
{
Test()
{
MyLabel label1 = new MyLabel();
label1.Parent = this;
label1.Text = "测试字符串,很长的!还不够长?";
label1.Width = 120;
label1.Height = 60;
MyLabel label2 = new MyLabel();
label2.Parent = this;
label2.Top = 65;
label2.Width = 50;
label2.Height = 20;
MyLabel label3 = new MyLabel();
label3.Parent = this;
label3.Top = 90;
label3.Width = 155;
label3.Height = 75;
label3.Text = "测试字符串,很长的!还不够长?那就再来!";
label3.TextAlign = ContentAlignment.BottomRight;
}
static void Main()
{
Application.Run(new Test());
}
}
}
namespace Skyiv.Windows.Forms
{
using System.Drawing; class Label : System.Windows.Forms.Label
{
// 以下3个字段也可以用属性实现
public new string Text = string.Empty; // 文本
public bool LineLimit = false; // 是否仅显示完整的文本行
public bool Wrap = true; // 文本是否自动换行 // 重绘控件
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
int chars, lines;
SizeF size = new SizeF(Width, Height);
StringFormatFlags sff = 0;
if (LineLimit) sff |= StringFormatFlags.LineLimit;
if (!Wrap) sff |= StringFormatFlags.NoWrap;
StringFormat sf = new StringFormat(sff);
e.Graphics.MeasureString(Text, Font, size, sf, out chars, out lines);
base.Text = Text.Substring(0, chars);
base.OnPaint(e);
}
}
}// 测试
namespace Skyiv.Test
{
using Label = Skyiv.Windows.Forms.Label;
using System.Windows.Forms; class Test : Form
{
Test()
{
Text = "测试字符串,很长的! 不够长? 那就再来!"; Label label1 = new Label();
label1.Parent = this;
label1.Text = Text;
label1.Width = 100;
label1.Height = 38; Label label2 = new Label();
label2.Parent = this;
label2.Text = Text;
label2.Top = 40;
label2.Width = 100;
label2.Height = 38;
label2.LineLimit = true; // 仅显示完整的文本行 Label label3 = new Label();
label3.Parent = this;
label3.Text = Text;
label3.Top = 80;
label3.Width = 100;
label3.Height = 38;
label3.Wrap = false; // 文本不自动换行 foreach (Control ctl in Controls)
{
if (ctl is System.Windows.Forms.Label)
{
((System.Windows.Forms.Label)ctl).BorderStyle = BorderStyle.FixedSingle;
}
}
} static void Main()
{
Application.Run(new Test());
}
}
}
// SLabel.cs (C) air|skyiv.com Fri 2005.07.29
namespace Skyiv.Windows.Forms
{
using System.Drawing; class Label : System.Windows.Forms.Label
{
public new string Text = string.Empty; // 文本
public bool LineLimit = false; // 是否仅显示完整的文本行
public bool Wrap = true; // 文本是否自动换行 private string DisplayText(Graphics g)
{
StringFormat sf = new StringFormat();
if (LineLimit) sf.FormatFlags |= StringFormatFlags.LineLimit;
if (!Wrap) sf.FormatFlags |= StringFormatFlags.NoWrap;
switch (TextAlign)
{
case ContentAlignment.TopLeft :
sf.LineAlignment = StringAlignment.Near ;
sf.Alignment = StringAlignment.Near ;
break;
case ContentAlignment.TopCenter :
sf.LineAlignment = StringAlignment.Near ;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.TopRight :
sf.LineAlignment = StringAlignment.Near ;
sf.Alignment = StringAlignment.Far ;
break;
case ContentAlignment.MiddleLeft :
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Near ;
break;
case ContentAlignment.MiddleCenter :
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.MiddleRight :
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Far ;
break;
case ContentAlignment.BottomLeft :
sf.LineAlignment = StringAlignment.Far ;
sf.Alignment = StringAlignment.Near ;
break;
case ContentAlignment.BottomCenter :
sf.LineAlignment = StringAlignment.Far ;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.BottomRight :
sf.LineAlignment = StringAlignment.Far ;
sf.Alignment = StringAlignment.Far ;
break;
}
int chars, lines;
g.MeasureString(Text, Font, ClientSize, sf, out chars, out lines);
return Text.Substring(0, chars);
} protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.Text = (Wrap && !LineLimit) ? Text : DisplayText(e.Graphics);
base.OnPaint(e);
}
}
}
可是汉字和英文字母 所占的像素不一样?
我怎么判断字符长度和label的宽度!?