datagridview中的垂直文本

Die*_*ego 11 .net c# datagridview vertical-text winforms

我想以垂直方向显示标题单元格中的文本.我该怎么做?

谢谢

Dav*_*all 16

您可以使用标题的自定义单元格绘制来获得所需的结果.

在回答你的评论,要求找到一种方法将文本与单元格的底部对齐时,我已经在我的代码中添加了注释.他们希望很清楚.

您需要以下代码(例如在初始化组件后在Form_Load中)

dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
dataGridView1.ColumnHeadersHeight = 50;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;

// Here we attach an event handler to the cell painting event
dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);
Run Code Online (Sandbox Code Playgroud)

接下来,您需要类似以下代码:

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    // check that we are in a header cell!
    if (e.RowIndex == -1 && e.ColumnIndex >= 0)
    {
        e.PaintBackground(e.ClipBounds, true);
        Rectangle rect = this.dataGridView1.GetColumnDisplayRectangle(e.ColumnIndex, true);
        Size titleSize = TextRenderer.MeasureText(e.Value.ToString(), e.CellStyle.Font);
        if (this.dataGridView1.ColumnHeadersHeight < titleSize.Width)
        {
            this.dataGridView1.ColumnHeadersHeight = titleSize.Width;
        }

        e.Graphics.TranslateTransform(0, titleSize.Width);
        e.Graphics.RotateTransform(-90.0F);

        // This is the key line for bottom alignment - we adjust the PointF based on the 
        // ColumnHeadersHeight minus the current text width. ColumnHeadersHeight is the
        // maximum of all the columns since we paint cells twice - though this fact
        // may not be true in all usages!   
        e.Graphics.DrawString(e.Value.ToString(), this.Font, Brushes.Black, new PointF(rect.Y - (dataGridView1.ColumnHeadersHeight - titleSize.Width) , rect.X));

        // The old line for comparison
        //e.Graphics.DrawString(e.Value.ToString(), this.Font, Brushes.Black, new PointF(rect.Y, rect.X));


        e.Graphics.RotateTransform(90.0F);
        e.Graphics.TranslateTransform(0, -titleSize.Width);
        e.Handled = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,我能够使用它.我应该添加2个注释:1 - 使用e.CellBounds而不是this.dataGridView1.GetColumnDisplayRectangle(...).原因是它更快,并且由于某种原因,当我访问dataGridView1时,我得到了视觉工件!2 - 要提高性能,请启用双缓冲(请参阅http://stackoverflow.com/questions/4255148/how-to-improve-painting-performance-of-datagridview) (4认同)

TFD*_*TFD 5

更简单、更有效的渲染器

通过设计器或使用这行代码附​​加事件

dataGridView1.CellPainting += new DataGridView1_CellPainting(dataGridView1_CellPainting);
Run Code Online (Sandbox Code Playgroud)

用于绘制旋转文本的事件处理程序

private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
    // Vertical text from column 0, or adjust below, if first column(s) to be skipped
    if (e.RowIndex == -1 && e.ColumnIndex >= 0) {
        e.PaintBackground(e.CellBounds, true);
        e.Graphics.TranslateTransform(e.CellBounds.Left , e.CellBounds.Bottom);
        e.Graphics.RotateTransform(270);
        e.Graphics.DrawString(e.FormattedValue.ToString(),e.CellStyle.Font,Brushes.Black,5,5);
        e.Graphics.ResetTransform();
        e.Handled = true;
    }
}
Run Code Online (Sandbox Code Playgroud)