XtraGrid: Показать пользовательский значок индикатора строки

Как показать пользовательский значок индикатора строки в элементе управления DevExpress XtraGrid?

В этом примере показано отображение текста в столбце RowIndicator. Но я хочу показать пользовательские изображения / значки из ресурсов на основе некоторых условий.

И в этом примере отображается значок ошибки.

Вот мой код:

Private cObj_ImageList As ImageList
cObj_ImageList = New ImageList()
cObj_ImageList.Images.Add(My.Resources.lock_red)
cObj_ImageList.Images.Add(My.Resources.unlock_blue)

Private Sub GridView_CustomDrawRowIndicator(sender As Object, e As RowIndicatorCustomDrawEventArgs)

    If e.Info.IsRowIndicator And e.RowHandle >= 0 Then
        Try
            For Each lObj_ChngdRow As ChangedRow In cObj_Lst_ChngdRows
                If lObj_ChngdRow.CRRowHandle = e.RowHandle And lObj_ChngdRow.IsEditable Then

                    'e.Graphics.DrawIcon(cObj_RowStateUnlock, 0, 0)
                    'e.Graphics.DrawImageUnscaled(My.Resources.unlock_blue, 0, 0)

                    e.Info.ImageIndex = -1

                    e.Painter.DrawObject(e.Info)

                    Dim rec As Rectangle = e.Bounds

                    rec.Inflate(-1, -1)

                    Dim x1 As Integer = rec.X + (rec.Width - cObj_ImageList.ImageSize.Width) / 2


                    Dim y1 As Integer = rec.Y + (rec.Height - cObj_ImageList.ImageSize.Height) / 2

                    e.Graphics.DrawImageUnscaled(cObj_ImageList.Images(1), x1, y1)

                    e.Handled = True

                End If
            Next
        Catch ex As Exception

        End Try
    End If

End Sub

введите описание изображения здесь Это показывает значок только для одной строки. Я хочу показать для всех строк. Но когда нажата кнопка " Оформить заказ", я хочу изменить этот значок.

РЕДАКТИРОВАТЬ 1:

Как пояснил nempoBu4, я изменил свой код, сделав его более простым:

Private Sub GridView_CustomDrawRowIndicator(sender As Object, e As RowIndicatorCustomDrawEventArgs)

    Try
        If e.Info.IsRowIndicator And e.RowHandle >= 0 Then

            e.Handled = True

            e.Graphics.DrawImageUnscaled(cObj_ImageList.Images(0), e.Bounds.X, e.Bounds.Y)

            Dim lObj_ChngdRow = cObj_Lst_ChngdRows.Find(Function(item) item.CRRowHandle = e.RowHandle AndAlso item.IsEditable)

            If Not lObj_ChngdRow Is Nothing Then

                e.Graphics.DrawImageUnscaled(cObj_ImageList.Images(1), e.Bounds.X, e.Bounds.Y)

            End If

        End If
    Catch ex As Exception

    End Try

End Sub

Смотрите прикрепленный скриншот.

введите описание изображения здесь

Красные и синие значки находятся друг над другом. Я думаю, что я должен очистить ImageList и затем добавить их снова.

1 ответ

Решение

CustomDrawRowIndicator событие запускается для каждой строки отдельно, поэтому вам не нужно использовать цикл для всех объектов в вашем cObj_Lst_ChngdRows коллекция. Также вам нужно отключить индикатор строки после добавления объекта в ваш cObj_Lst_ChngdRows коллекция. Для этого вам нужно использовать GridView.InvalidateRowIndicator метод.
Вот пример:

Private Sub CheckoutButton_Click(sender As Object, e As EventArgs)

    Dim rowHandle = gvException.FocusedRowHandle

    Dim row = New ChangedRow()
    row.CRRowHandle = rowHandle
    row.IsEditable = True

    cObj_Lst_ChngdRows.Add(row)

    gvException.InvalidateRowIndicator(rowHandle)

End Sub

Private Sub GridView_CustomDrawRowIndicator(sender As Object, e As RowIndicatorCustomDrawEventArgs)
    If e.Info.IsRowIndicator AndAlso e.RowHandle >= 0 Then
        Try
            Dim lObj_ChngdRow = cObj_Lst_ChngdRows.Find(Function(item) item.CRRowHandle = e.RowHandle AndAlso item.IsEditable)

            If Not lObj_ChngdRow Is Nothing Then
                e.Info.ImageIndex = -1
                e.Painter.DrawObject(e.Info)

                Dim rec As Rectangle = e.Bounds

                rec.Inflate(-1, -1)

                Dim x1 As Integer = rec.X + (rec.Width - cObj_ImageList.ImageSize.Width) / 2
                Dim y1 As Integer = rec.Y + (rec.Height - cObj_ImageList.ImageSize.Height) / 2

                e.Graphics.DrawImageUnscaled(cObj_ImageList.Images(1), x1, y1)
                e.Handled = True
            End If
        Catch ex As Exception
        End Try
    End If
End Sub

РЕДАКТИРОВАТЬ 1

Вы звоните e.Graphics.DrawImageUnscaled метод дважды. Вы должны вызывать этот метод только один раз.
Вот пример:

Private Sub GridView_CustomDrawRowIndicator(sender As Object, e As RowIndicatorCustomDrawEventArgs)

    Try
        If e.Info.IsRowIndicator And e.RowHandle >= 0 Then
            e.Handled = True

            Dim lObj_ChngdRow = cObj_Lst_ChngdRows.Find(Function(item) item.CRRowHandle = e.RowHandle AndAlso item.IsEditable)

            Dim imageIndex As Integer

            If lObj_ChngdRow Is Nothing Then
                imageIndex = 0
            Else
                imageIndex = 1
            End If

            e.Graphics.DrawImageUnscaled(cObj_ImageList.Images(imageIndex), e.Bounds.X, e.Bounds.Y)
        End If
    Catch ex As Exception

    End Try

End Sub
Другие вопросы по тегам