Visual Basic.NET - Columna datagriview con control usuario

 
Vista:
sin imagen de perfil
Val: 129
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Columna datagriview con control usuario

Publicado por Jaime (50 intervenciones) el 11/11/2022 18:21:22
Buenas, mi problema es el siguiente, he creado un control y no se que tipo de columna en datagridview debo usar para que incorpore un UserControl.
Alguien me puede decir si eso es factible? Y si lo es, algún tuto o explicación de como incorporarlo.
Si se necesita mas información para responderme o entenderme, hacédmelo saber. Soy escueto porque es una pregunta sencilla con explicación compleja jejej
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 129
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Columna datagriview con control usuario

Publicado por Jaime (50 intervenciones) el 15/11/2022 22:32:26
He comenzado creando un tipo de columna heredando de DataGridViewColumn:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Imports System
Imports System.Windows.Forms
 
#Region "CLASE COLUMNA"
Public Class UserControlColumn
 
    Inherits DataGridViewColumn
 
    Public Sub New()
        MyBase.New(New UserControlCell())
    End Sub
 
    Public Overrides Property CellTemplate() As DataGridViewCell
        Get
            Return MyBase.CellTemplate
        End Get
        Set(ByVal value As DataGridViewCell)
 
            ' Asegúrese de que la celda utilizada para la plantilla es UserControlCell.
            If (value IsNot Nothing) AndAlso
                Not value.GetType().IsAssignableFrom(GetType(UserControlCell)) Then
                Throw New InvalidCastException("Debe ser un UserControl")
            End If
 
            MyBase.CellTemplate = value
 
        End Set
    End Property
 
End Class

Después he creado un nuevo tipo de celda heredando de DataGridViewCell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
Public Class UserControlCell
    Inherits DataGridViewCell
    Public Sub New()
 
    End Sub
 
    Protected Overrides Sub Paint(graphics As Graphics, clipBounds As Rectangle, cellBounds As Rectangle, rowIndex As Integer,
                      cellState As DataGridViewElementStates, value As Object, formattedValue As Object, errorText As String,
                      cellStyle As DataGridViewCellStyle, advancedBorderStyle As DataGridViewAdvancedBorderStyle,
                      paintParts As DataGridViewPaintParts)
 
 
        MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts)
 
    End Sub
 
    Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer,
            ByVal initialFormattedValue As Object,
            ByVal dataGridViewCellStyle As DataGridViewCellStyle)
 
        'Establezca el valor del control de edición en el valor de celda actual.
        MyBase.InitializeEditingControl(rowIndex, initialFormattedValue,
                dataGridViewCellStyle)
 
        Dim ctl As UserControlEditingControl =
                CType(DataGridView.EditingControl, UserControlEditingControl)
 
        '' Utilice el valor de fila predeterminado cuando la propiedad Value es null.
        'If (Me.Value Is Nothing) Then
        '    ctl.Value = CType(Me.DefaultNewRowValue, DateTime)
        'Else
        '    ctl.Value = CType(Me.Value, DateTime)
        'End If
    End Sub
 
    Public Overrides ReadOnly Property EditType() As Type
        Get
            ' Devuelve el tipo de control de edición que utiliza UserControl.
            Return GetType(UserControlEditingControl)
        End Get
    End Property
 
    Public Overrides Property ValueType() As Type
        Get
            ' Devuelve el tipo de valor que contiene UserControl.
            Return GetType(String)
        End Get
        Set(value As Type)
 
        End Set
    End Property
 
    Public Overrides ReadOnly Property DefaultNewRowValue() As Object
        Get
            'Utilice nothing como elemento predeterminado
            Return Nothing
        End Get
    End Property
 
#Region "CLASE UserControlEditingControl"
    Class UserControlEditingControl
        Inherits ctrl_btn_Aviso
        Implements IDataGridViewEditingControl
 
        Private dataGridViewControl As DataGridView
        Private valueIsChanged As Boolean = False
        Private rowIndexNum As Integer
 
        Public Sub New()
 
            MyBase.New()
 
        End Sub
 
        Public Property EditingControlFormattedValue() As Object _
        Implements IDataGridViewEditingControl.EditingControlFormattedValue
 
            Get
                Return Me.Controls(1).Text
            End Get
 
            Set(ByVal value As Object)
 
                Me.Controls(1).Text = value
 
            End Set
 
        End Property
 
        Public Function GetEditingControlFormattedValue(ByVal context As DataGridViewDataErrorContexts) As Object _
        Implements IDataGridViewEditingControl.GetEditingControlFormattedValue
 
            Return Me.Controls(1).Text
 
        End Function
 
        Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As DataGridViewCellStyle) _
        Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl
 
            'Me.Font = dataGridViewCellStyle.Font
            'Me.Controls(1).ForeColor = dataGridViewCellStyle.ForeColor
            'Me.Controls(1).BackColor = dataGridViewCellStyle.BackColor
 
        End Sub
 
        Public Property EditingControlRowIndex() As Integer _
        Implements IDataGridViewEditingControl.EditingControlRowIndex
 
            Get
                Return rowIndexNum
            End Get
            Set(ByVal value As Integer)
                rowIndexNum = value
            End Set
 
        End Property
 
        Public Function EditingControlWantsInputKey(ByVal key As Keys,
        ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
        Implements IDataGridViewEditingControl.EditingControlWantsInputKey
 
            'Deje que UserControl controle las claves enumeradas
            Select Case key And Keys.KeyCode
                Case Keys.Left, Keys.Up, Keys.Down, Keys.Right,
                Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp
 
                    Return True
 
                Case Else
                    Return Not dataGridViewWantsInputKey
            End Select
 
        End Function
 
        Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
        Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
 
            ' No preparation needs to be done.
 
        End Sub
 
        Public ReadOnly Property RepositionEditingControlOnValueChange() _
        As Boolean Implements _
        IDataGridViewEditingControl.RepositionEditingControlOnValueChange
 
            Get
                Return False
            End Get
 
        End Property
 
        Public Property EditingControlDataGridView() As DataGridView _
        Implements IDataGridViewEditingControl.EditingControlDataGridView
 
            Get
                Return dataGridViewControl
            End Get
            Set(ByVal value As DataGridView)
                dataGridViewControl = value
            End Set
 
        End Property
 
        Public Property EditingControlValueChanged() As Boolean _
        Implements IDataGridViewEditingControl.EditingControlValueChanged
 
            Get
                Return valueIsChanged
            End Get
            Set(ByVal value As Boolean)
                valueIsChanged = value
            End Set
 
        End Property
 
        Public ReadOnly Property EditingControlCursor() As Cursor _
        Implements IDataGridViewEditingControl.EditingPanelCursor
 
            Get
                Return MyBase.Cursor
            End Get
 
        End Property
 
    End Class
 
#End Region
 
End Class

Desde el Load del Form declaro una instancia de la clase columna y se la añado al datagridview, le añado 5 lineas para ver el resultado del user control, pero es como si se pintara del color del Datagrid,

1
2
3
4
5
6
Dim col As New UserControlColumn()
        col.HeaderText = "USERCONTROL"
 
        Me.dgv_Prueba.Columns.Add(col)
 
        Me.dgv_Prueba.Rows.Add(5)

No se más, y no creo que lo haya hecho bien, pero creo que el camino es ese

Capturas del resultado y del user control que debería verse


CAPTURA-1
CAPTURA-2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar