gan*_*esh 5 .net c# datagridview word-wrap winforms
这个问题在这里被多次询问,但他们的答案对我不起作用.
我使用C#DataGridView以表格形式显示数据.我有一些8/9列和大约25到30行.对于每列,我设置自定义宽度(总屏幕宽度的一定百分比,每列的不同).为了实现它,我设置了以下属性
view1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Run Code Online (Sandbox Code Playgroud)
此外,由于我的应用程序是这样的,我不能同时显示所有行但是没有.一次由用户定义的行,为此我在计时器中使用scrollindex属性来滚动视图.我也定制了行高(总屏幕高度的一定百分比).因此,为了不同时显示所有行,我使用以下属性
view1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
Run Code Online (Sandbox Code Playgroud)
我正在使用包装
view1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
Run Code Online (Sandbox Code Playgroud)
但是上面的属性包含了中间只有空格而不是单个长字的单词.
那么如何用上面的行和列大小属性包装单个长字?我在很多地方都在寻求建议
view1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
view1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
Run Code Online (Sandbox Code Playgroud)
但是每当我在AutoSizeColumnsMode中使用除"none"以外的任何内容时,我的列的自定义宽度会发生变化,如果我在AutoSizeRowsMode中使用除"none"以外的任何内容,它会一次显示所有行,并且我的行的自定义高度会发生变化.
谁知道如何解决这个问题?
注意:它是桌面应用程序(Windows窗体应用程序).
使用 DataGridView CellPainting 事件。示例代码:
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
//dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
//dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
//dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.Cells[0].Value = "CELL123456789012345679801234567890";
row.Cells[1].Value = "CELL 1";
row.Cells[2].Value = "CELL 2";
row.Cells[3].Value = "CELL 3";
row.Cells[4].Value = "CELL 4";
row.Cells[5].Value = "CELL 5";
}
}
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.Value == null)
return;
var s = e.Graphics.MeasureString(e.Value.ToString(), dataGridView1.Font);
if (s.Width > dataGridView1.Columns[e.ColumnIndex].Width)
{
using (
Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
backColorBrush = new SolidBrush(e.CellStyle.BackColor))
{
e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
e.Graphics.DrawString(e.Value.ToString(), dataGridView1.Font, Brushes.Black, e.CellBounds, StringFormat.GenericDefault);
dataGridView1.Rows[e.RowIndex].Height = (int)(s.Height * Math.Ceiling(s.Width / dataGridView1.Columns[e.ColumnIndex].Width));
e.Handled = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
改进后的代码:
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.Value == null)
return;
var s = e.Graphics.MeasureString(e.Value.ToString(), dataGridView1.Font);
if (s.Width > dataGridView1.Columns[e.ColumnIndex].Width)
{
using (Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor), backColorBrush = new SolidBrush(e.CellStyle.BackColor))
{
using (Pen gridLinePen = new Pen(gridBrush))
{
e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom - 1);
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);
e.Graphics.DrawString(e.Value.ToString(), dataGridView1.Font, Brushes.Black, e.CellBounds, StringFormat.GenericDefault);
dataGridView1.Rows[e.RowIndex].Height = (int)(s.Height * Math.Ceiling(s.Width / dataGridView1.Columns[e.ColumnIndex].Width));
e.Handled = true;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)