본문 바로가기

VB.NET

[TIPS] DataGrid의 셀에 이미지를 표시하는 방법

반응형

DataGridColumnStyle.Paint 메소드를 오버라이드하여 DataGridColumnStyle로부터의 상속 클래스를 작성하는 것으로써 셀에 이미지를 표시할 수 있게 됩니다.


우선 다음과 같은 클래스를 작성하여, Paint 메소드에서 이미지를 작성할수 있도록 합니다.

아래의 예에서는 DataGridTextBoxColumn의 상속 클래스 DataGridImageTextBoxColumn 클래스를 작성해, 셀의 값이 이미지 파일명이라고 하여 이미지를 작성하도록 합니다.

 

'셀에 이미지를 표시하기위한 클래스

'셀의값(문자열)을 파일명이라하여 이미지를 표시한다.
'DataGridTextBoxColumn를 계승하는 클래스를 작성

Public Class DataGridImageTextBoxColumn
    Inherits DataGridTextBoxColumn

    'Paint메소드를 오버라이드한다.
    Protected Overloads Overrides Sub Paint( _
            ByVal g As Graphics, _
            ByVal bounds As Rectangle, _
            ByVal source As CurrencyManager, _
            ByVal rowNum As Integer, _
            ByVal backBrush As Brush, _
            ByVal foreBrush As Brush, _
            ByVal alignToRight As Boolean _
            )

     '셀의값을 취득한다.
     Dim cellValue As Object = _
            Me.GetColumnValueAtRow(source, rowNum)
        If (Not cellValue Is Nothing) Then

            '표시된 파일명을 취득

            Dim fileName As String
            fileName = CType(cellValue, String)
            Try

                '이미지를 읽어온다.
                Dim bmp As New Bitmap(fileName)

                'bounds의 크기로 이미지를 표시한다.

                '(셀의 크기에 맞춰서 화면이 표시된다.)
                g.DrawImage(bmp, bounds)
            Catch ex As Exception

                '이미지를 불러오지 못한경우는 평상시대로 표시한다.
                MyBase.Paint(g, bounds, source, rowNum, _
                    backBrush, foreBrush, alignToRight)
            End Try
        End If
    End Sub

 

    '편집이 불가능하도록 Edit메소드를 오버라이드 한다.
    Protected Overloads Overrides Sub Edit( _
        ByVal source As CurrencyManager, _
        ByVal rowNum As Integer, _
        ByVal bounds As Rectangle, _
        ByVal [readOnly] As Boolean, _
        ByVal instantText As String, _
        ByVal cellIsVisible As Boolean)
    End Sub
End Class

 

다음에 이미지를 표시하고 싶은 열에 이 열의 스타일을 사용하도록 합니다.

아래의 예 에서는 데이터 소스가"Column1"이라는 이름의 DataColumn이 있는"DataTable1"라는 이름의 DataTable인 것을 전제로 하고 있습니다.

 

'새로운DataGridTableStyle 작성
Dim ts As New DataGridTableStyle()

'매핑이름을 지정

ts.MappingName = "DataTable1"

'행의 높이를 설정
ts.PreferredRowHeight = 200

'열의 스타일로는 DataGridImageTextBoxColumn를 사용한다.
Dim cs As DataGridImageTextBoxColumn
cs = New DataGridImageTextBoxColumn()

'매핑이름을 지정한다.
cs.MappingName = "Column1"

'간격을 지정한다.
cs.Width = 200

'DataGridTableStyle을 추가한다.
ts.GridColumnStyles.Add(cs)

'테이블스타일을 데이터그리드에 추가한다.
DataGrid1.TableStyles.Add(ts)

 

 

반응형