我有一个未绑定的 DataGridView(在 VS 2008 中),其中一列包含一个文件路径。我想在 ColumnWidthChanged 事件上使用 TextRenderer 类来格式化字符串,而无需实际修改基础值。问题是表格的内容在表单关闭时被保存,我不想保存格式化的值。我想我太深了,看不到明显的解决方案,所以我依靠你们来指出:-)。
这个想法是显示这个:
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe
...这样(取决于列的宽度):
C:\Program Files\Microso…\gacutil.exe
看来我说得太早了。我从 TextRenderer.MeasureText() 得到了一些非常奇怪的结果。如果我将路径值硬编码为“C:\Documents and Settings\jluce\My Documents\Downloads”,它最终会变成 C:\Documents and Settings\jluce\M...\Downloads\0wnloads”。如果我不这样做t 对其进行硬编码(如下所示),每次我调整列大小时它都会进一步损坏。
这是几次调整大小后的样子: 截图
这是我目前正在做的事情。
if (e.ColumnIndex == 1)
{
foreach (DataGridViewRow Row in mappingsDataGrid.Rows)
{
string Path = (string)Row.Cells[1].Value;
Path = Path.Trim();
TextRenderer.MeasureText(Path, e.CellStyle.Font,
new Size(mappingsDataGrid.Columns[e.ColumnIndex].Width, Row.Height),
TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);
e.Value = Path;
}
}
这只会越来越奇怪!
我设法通过遍历每个字符并删除坏字符来解决损坏字符串的问题。然而,现在我遇到了一个更疯狂的问题。我在事件处理程序中分配的局部变量在调用之间保留其值。
以下是相关代码:
string Path = ""; // <-- #1
Path = "C:\\Documents and Settings\\jluce\\My Documents\\Downloads"; // <-- #2
TextRenderer.MeasureText(Path, Row.Cells[1].Style.Font,
new Size((mappingsDataGrid.Columns[e.Column.Index].Width), Row.Height),
TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);
// Left out code that strips invalid chars
Row.Cells[1].Value = Path; // <-- #3
Path = null;
第一次调整列大小(请参阅上面评论中的#):
- 在此行之后路径包含“”。
- 在此行之后,路径包含字符串,就像上面显示的那样。
- 路径包含应截断的文件路径(即“C:\Documents and Setti...\Downloads”)
第二次调整大小:
- 在此行之后路径包含“”,因为它应该。
- 在此行之后,路径包含“C:\Documents and Set...\Downloads\0 Documents\Downloads”,这是在我去除无效字符之前的上一次迭代中的无效值(此处显示为 '\0')! !
- 现在的路径是 FUBAR,因为我从一个搞砸的字符串开始,它只会变得更糟。
当我明确地为它分配一个值时,为什么会从上一个函数调用中为 Path 分配无效值(在正确分配一个空字符串之后!)?!!!!!!