打印 DataGrid 时文本换行? 。网
我正在尝试在 Windows 窗体应用程序中打印 DataGrid,当列的宽度设置(可自定义)太窄而无法容纳文本时,它只会截断文本而不是换行。 DataGrid 中是否有设置文本换行的属性?
我添加了一些代码,也许可以帮助诊断问题。
private void PrintRow(PointF location, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
PointF curLocation = location;
//Measure the height of one row
SizeF charSize = g.MeasureString(MEASURE_CHAR.ToString(), this.Grid.Font);
float rowHeight = charSize.Height + CELL_PADDING * 2;
//Print the vertical gridline on the left side of the first cell
//Note that we only print the vertical gridlines down to the bottom
//of the last printed row
int maxRowsOnPage = (int)Math.Floor(e.MarginBounds.Height / rowHeight);
int rowsRemaining = this.Grid.Rows.Count - _curRowIdx;
int rowsToPrint = Math.Min(maxRowsOnPage, rowsRemaining);
float bottom = e.MarginBounds.Top + (rowsToPrint * rowHeight);
g.DrawLine(Pens.Black, curLocation.X, e.MarginBounds.Top, curLocation.X, bottom);
DataGridViewRow row = this.Grid.Rows[_curRowIdx];
foreach (QueryField field in _fields)
{
foreach (DataGridViewCell cell in row.Cells)
{
//Exit early if this is not the correct cell
if (this.Grid.Columns[cell.ColumnIndex].HeaderText != field.FieldLabel) continue;
//Calculate where we need to draw the next cell
int maxChars = field.MaxLength > 0 ? field.MaxLength : field.FieldLabel.Length;
SizeF maxSize = g.MeasureString(string.Empty.PadLeft(maxChars, MEASURE_CHAR), this.Grid.Font);
RectangleF boundingRect = new RectangleF(curLocation, maxSize);
//Make sure we don't overshoot the right margin
if (boundingRect.Left >= e.MarginBounds.Right)
{
break;
}
if (boundingRect.Right > e.MarginBounds.Right)
{
boundingRect.Width = boundingRect.Width - (boundingRect.Right - e.MarginBounds.Right);
}
//Get the field value
string fieldValue = string.Empty;
if (cell.Value != null)
{
fieldValue = cell.Value.ToString();
}
//Draw the field value
g.DrawString(fieldValue, this.Grid.Font, Brushes.Black, (RectangleF)boundingRect, sf);
curLocation.X += boundingRect.Width;
curLocation.X += CELL_PADDING;
//Print the vertical gridline between this cell and the next
if (boundingRect.Right <= e.MarginBounds.Right)
{
g.DrawLine(Pens.Black, curLocation.X, e.MarginBounds.Top, curLocation.X, bottom);
}
//Move the current location to the next position
curLocation.X += CELL_PADDING;
}
}
//Draw the top gridline
g.DrawLine(Pens.Black, e.MarginBounds.Left, e.MarginBounds.Top, curLocation.X, e.MarginBounds.Top);
//Draw the bottom gridline
curLocation.Y += charSize.Height;
curLocation.Y += CELL_PADDING;
g.DrawLine(Pens.Black, e.MarginBounds.Left, curLocation.Y, curLocation.X, curLocation.Y);
}
I'm trying to print a DataGrid in a windows forms app and when the width of the columns is set (it's customizable) too narrow to fit the text it just truncates the text instead of wrapping it. Is there a property in DataGrid that sets text wrapping?
I've added some code to perhaps help with diagnosis of the issue.
private void PrintRow(PointF location, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
PointF curLocation = location;
//Measure the height of one row
SizeF charSize = g.MeasureString(MEASURE_CHAR.ToString(), this.Grid.Font);
float rowHeight = charSize.Height + CELL_PADDING * 2;
//Print the vertical gridline on the left side of the first cell
//Note that we only print the vertical gridlines down to the bottom
//of the last printed row
int maxRowsOnPage = (int)Math.Floor(e.MarginBounds.Height / rowHeight);
int rowsRemaining = this.Grid.Rows.Count - _curRowIdx;
int rowsToPrint = Math.Min(maxRowsOnPage, rowsRemaining);
float bottom = e.MarginBounds.Top + (rowsToPrint * rowHeight);
g.DrawLine(Pens.Black, curLocation.X, e.MarginBounds.Top, curLocation.X, bottom);
DataGridViewRow row = this.Grid.Rows[_curRowIdx];
foreach (QueryField field in _fields)
{
foreach (DataGridViewCell cell in row.Cells)
{
//Exit early if this is not the correct cell
if (this.Grid.Columns[cell.ColumnIndex].HeaderText != field.FieldLabel) continue;
//Calculate where we need to draw the next cell
int maxChars = field.MaxLength > 0 ? field.MaxLength : field.FieldLabel.Length;
SizeF maxSize = g.MeasureString(string.Empty.PadLeft(maxChars, MEASURE_CHAR), this.Grid.Font);
RectangleF boundingRect = new RectangleF(curLocation, maxSize);
//Make sure we don't overshoot the right margin
if (boundingRect.Left >= e.MarginBounds.Right)
{
break;
}
if (boundingRect.Right > e.MarginBounds.Right)
{
boundingRect.Width = boundingRect.Width - (boundingRect.Right - e.MarginBounds.Right);
}
//Get the field value
string fieldValue = string.Empty;
if (cell.Value != null)
{
fieldValue = cell.Value.ToString();
}
//Draw the field value
g.DrawString(fieldValue, this.Grid.Font, Brushes.Black, (RectangleF)boundingRect, sf);
curLocation.X += boundingRect.Width;
curLocation.X += CELL_PADDING;
//Print the vertical gridline between this cell and the next
if (boundingRect.Right <= e.MarginBounds.Right)
{
g.DrawLine(Pens.Black, curLocation.X, e.MarginBounds.Top, curLocation.X, bottom);
}
//Move the current location to the next position
curLocation.X += CELL_PADDING;
}
}
//Draw the top gridline
g.DrawLine(Pens.Black, e.MarginBounds.Left, e.MarginBounds.Top, curLocation.X, e.MarginBounds.Top);
//Draw the bottom gridline
curLocation.Y += charSize.Height;
curLocation.Y += CELL_PADDING;
g.DrawLine(Pens.Black, e.MarginBounds.Left, curLocation.Y, curLocation.X, curLocation.Y);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
试试这个线程。 有人有完全相同的问题。 希望能帮助到你!
如何在 Windows 应用程序中的数据网格的文本框列中换行文本。
Try this thread. Someone with the exact same problem. Hope it helps!
How to Wrap text in a text box column of datagrid in windows application.