none
DataGridView_CellPainting 問題 RRS feed

  • 問題

  • Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dt As DataTable = New DataTable()
        dt.Columns.Add()
        dt.Columns.Add()
    
        dt.Columns.Item(0).DataType = Type.GetType("System.String")
        dt.Columns.Item(1).DataType = Type.GetType("System.String")
    
        Dim dr As DataRow
        dr = dt.NewRow()
        dr(0) = 1
        dr(1) = "222222222222222222222"
        dt.Rows.Add(dr)
        dr = dt.NewRow()
        dr(0) = 33
        dr(1) = 4
        dt.Rows.Add(dr)
        DataGridView1.DataSource = dt
    End Sub
    
    Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
        If e.RowIndex < 0 Then Exit Sub
        If e.RowIndex = Me.DataGridView1.RowCount - 1 Then Exit Sub
        If e.ColumnIndex < 0 Then Exit Sub
    
        If e.ColumnIndex = 1 Then
    
            Dim backColorBrush As SolidBrush
            Dim fontBrush As SolidBrush
    
            If Me.DataGridView1.CurrentCell.RowIndex = e.RowIndex AndAlso Me.DataGridView1.CurrentCell.ColumnIndex = 1 Then
                backColorBrush = New SolidBrush(e.CellStyle.SelectionBackColor)
                fontBrush = New SolidBrush(e.CellStyle.SelectionForeColor)
                e.Graphics.FillRectangle(backColorBrush, e.CellBounds)
                e.Graphics.DrawImage(My.Resources.mouse, e.CellBounds.X + 1, e.CellBounds.Y + 5)
                e.Graphics.DrawString(e.Value.ToString, e.CellStyle.Font, fontBrush, e.CellBounds.X + 20, e.CellBounds.Y + 6)
            Else
                backColorBrush = New SolidBrush(e.CellStyle.BackColor)
                fontBrush = New SolidBrush(e.CellStyle.ForeColor)
                e.Graphics.FillRectangle(backColorBrush, e.CellBounds)
                e.Graphics.DrawImage(My.Resources.mouse, e.CellBounds.X + 1, e.CellBounds.Y + 5)
                e.Graphics.DrawString(e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + 20, e.CellBounds.Y + 6)
            End If
    
            Dim gridBrush As New SolidBrush(Me.DataGridView1.GridColor)
            Dim gridLinePen As New Pen(gridBrush)
            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom)
    
            e.Handled = True
        End If
    
    End Sub
    


    目前程式可以跑,不過有個問題是,如我的儲存格的寬度不夠內容(如22222222222222)

    目前使用e.Graphics.DrawString方式,會印超出儲存格,而影響後續欄位。

    想請問如何設定可以如以前過長時或變成...(如2222222...)

    2011年9月15日 下午 12:44

解答

  • 利用Graphics.MeasureString 取得要Draw的String的寬度

     若超出繪製的範圍 就改成 ...


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    • 已標示為解答 小見光二 2011年9月15日 下午 01:24
    2011年9月15日 下午 01:08