C# Code
namespace RowNumberPaint
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 新增 1000 筆資料
dataGridView1.RowCount = 1000;
// 故意把 RowHeader 設定窄些
dataGridView1.RowHeadersWidth = 30;
}
private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var dgv = sender as DataGridView;
if (dgv.RowHeadersVisible == false)
return;
string rowNumber = (e.RowIndex + 1).ToString();
var font = dgv.RowHeadersDefaultCellStyle.Font;
var brush = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor);
SizeF textSize = e.Graphics.MeasureString(rowNumber, font);
// 文字置中
float x = (dgv.RowHeadersWidth - textSize.Width) / 2;
float y = e.RowBounds.Location.Y + ((e.RowBounds.Height - textSize.Height) / 2);
e.Graphics.DrawString(rowNumber, font, brush, x, y);
// 當文字超過 RowHeaders 寬度時,會自動延伸
int width = (int)textSize.Width;
if (dgv.RowHeadersWidth <= width)
dgv.RowHeadersWidth += width;
}
}
}
使用 MeasureString() 來測量文字寬高來達到兩個需求
- 讓文字寬高都可以在 RowHeader 內置中
- 判斷文字是否寬於 RowHeader,有超過要自動延伸
從下圖數字 9 到 10 可以觀察到行數有在 RowHeader 內置中
從下圖數字 99 到 100 可以觀察到 RowHeader 有自動延伸,橫向 ScrollBar 也出現啦
沒有留言:
張貼留言