我有一个非常快速(我希望是基本)的问题。我正在为我公司的网站修改一些 C# 代码。代码在固定列中为我绘制一个表,其数据是从数据库中提取的。表格每列的高度是固定的(当前),我需要更改它,以便如果字符串是一定的长度,因此换行,则第二行文本是可查看的(而不是被下一行隐藏)。
根据我的研究,我似乎可以使用 MeasureString(因为我知道字体和字符串)来查看字符串是否比我设置的表列长/宽,如果是这样,请更改行的高度。但是,我对 C# 编程非常陌生(除了 Web 之外,多年来总体上没有做过太多编程),所以我不确定如何实现所有这些。我有逻辑,我知道如何更改高度,我只需要知道如何获得一个实际数字,我可以使用逻辑来反对使用 MeasureString 方法(以及如何实例化我可能需要使用该方法的任何变量和函数)。
您需要将此重载用于MeasureString(string,font,int)
:
width 参数指定宽度分量的最大值 返回的 SizeF 结构(宽度)。如果宽度参数为 小于字符串的实际宽度,返回的 Width 组件 被截断为表示最大字符数的值 这将适合指定的宽度。为了容纳整个 字符串,返回的高度组件将调整为一个值 允许显示带字符换行的字符串。
-- 从上面链接的 MSDN 页面(强调我的)
// Measure string (you'll need to instansiate your own graphics object,
// since you wont have PaintEventArgs)
SizeF stringSize = new SizeF();
stringSize = e.Graphics.MeasureString(measureString, stringFont, stringWidth);
int cellHeight = stringSize.Height;
e.Graphics.MeasureString()
或TextRenderer.MeasureText()
下面描述了它们各自的区别和优点:
TextRenderer.MeasureText and Graphics.MeasureString 大小不匹配
在那里,您还将找到使用示例,为了避免重复,我将跳过此处。
MSDN 提供了一个示例,在该示例中,通过将事件处理程序注册到控件的 OnPaint 方法(在实例化控件中),或者重写 OnPaint 方法(在继承的控件中),或通过重写窗体的 OnPaint 方法(不是最佳做法,因为您可能不希望对每个窗体重绘执行此操作)来计算此值。OnPaint 方法将允许您访问图形对象,以便您可以调用 MeasureString 方法。
请考虑以下事项:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
label1.Paint += new PaintEventHandler(label1_Paint);
}
void label1_Paint(object sender, PaintEventArgs e)
{
SizeF size = e.Graphics.MeasureString(label1.Text, label1.Font);
this.label1.Width = (int)size.Width;
this.label1.Height = (int)size.Height;
}
}