星期日, 8月 11, 2024

[C#] DataGridView 繪製行號

DataGridView 常見功能 - 在 RowHeader 上繪製行號,透過該練習來熟悉 RowPostPaint 事件DataGridViewRowPostPaintEventArgs


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()

使用 MeasureString() 來測量文字寬高來達到兩個需求
  • 讓文字寬高都可以在 RowHeader 內置中
  • 判斷文字是否寬於 RowHeader,有超過要自動延伸

從下圖數字 9 到 10 可以觀察到行數有在 RowHeader 內置中
從下圖數字 99 到 100 可以觀察到 RowHeader 有自動延伸,橫向 ScrollBar 也出現啦

沒有留言:

張貼留言