我有一个非常快的(我希望是基本的)问题。我正在为我公司的网站修改一些C#代码。代码在固定列中为我绘制一个表,其数据从数据库中提取。表的每一列的高度是固定的(当前),我需要更改它,所以如果字符串是一定长度,因此包装,第二行文本是可见的(而不是被下一行隐藏)
从我的研究中,似乎我可以使用MeasureString(因为我知道字体和字符串)来查看字符串是否比我的set table列更长/更宽,如果是这样,则更改行的高度。但是,我对C#编程非常陌生(除了Web内容之外,多年来总体上没有做太多的编程),所以我不确定如何实现所有这些。我有逻辑,我知道如何改变高度,我只需要知道如何获得一个实际的数字我可以使用逻辑来反对使用MeasureString方法(以及如何实例化我可能需要使用的任何变量和函数那个方法)。
答案 0 :(得分:2)
我认为你需要对MeasureString(string,font,int)
使用此重载:
width参数指定宽度组件的最大值 返回的SizeF结构(宽度)。如果width参数是 小于字符串的实际宽度,返回的Width组件 被截断为表示最大字符数的值 这将适合指定的宽度。 容纳整个 string,返回的Height组件调整为一个值 允许用字符包装显示字符串。
- 从上面链接的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;
答案 1 :(得分:1)
您可以使用e.Graphics.MeasureString()
或TextRenderer.MeasureText()
这里描述了每个人的差异和优势:
TextRenderer.MeasureText and Graphics.MeasureString mismatch in size
在那里你还会找到一些用法示例,我将跳过这些示例以避免重复。
答案 2 :(得分:1)
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;
}
}