Here is the code for my basic ExtendedDataGri dColumn as well as for an
inherited ExtendedComboBo xColumn.
#Region "ExtendedDataGr idColumn"
Public MustInherit Class ExtendedDataGri dColumnStyle
Inherits DataGridColumnS tyle
#Region "Private"
#Region "Properties "
Private mxMargin As Integer = 2
Private myMargin As Integer = 1
Private WithEvents mcellControl As Control = Nothing
Private mText As String = ""
Private moldVal As String = String.Empty
Private minEdit As Boolean = False
Private mrowNum As Integer
Private WithEvents msource As CurrencyManager
Private mIsDirty As Boolean = False
Private ReadOnly Property DataGridTableGr idLineWidth() As Integer
Get
If Me.DataGridTabl eStyle.GridLine Style =
DataGridLineSty le.Solid Then
Return 1
Else
Return 0
End If
End Get
End Property
#End Region
#End Region
#Region "Protected"
#Region "Functions"
Protected Overrides Function GetPreferredHei ght(ByVal g As
System.Drawing. Graphics, ByVal value As Object) As Integer
Dim NewLineIndex As Integer = 0
Dim NewLines As Integer = 0
Dim ValueString As String = Me.GetText(valu e)
Do
While NewLineIndex <> -1
NewLineIndex = ValueString.Ind exOf("r\n",
NewLineIndex + 1)
NewLines += 1
End While
Loop
Return FontHeight * NewLines + myMargin
End Function
Protected Overrides Function GetPreferredSiz e(ByVal g As
System.Drawing. Graphics, ByVal value As Object) As System.Drawing. Size
Dim Extents As Size =
Size.Ceiling(g. MeasureString(G etText(value), _
Me.DataGridTabl eStyle.DataGrid .Font))
Extents.Width += mxMargin * 2 + DataGridTableGr idLineWidth
Extents.Height += myMargin
Return Extents
End Function
Protected Overridable Function GetText(ByVal Value As Object) As
String
If Value Is System.DBNull.V alue Then Return NullText
If Not Value Is Nothing Then
Return Value.ToString
Else
Return String.Empty
End If
End Function
Protected Overrides Sub ColumnStartedEd iting(ByVal
editingControl As System.Windows. Forms.Control)
RaiseEvent ColumnEdited(Me , New System.EventArg s)
If (Not editingControl. Text = Me.OldValue) _
OrElse (editingControl .Text Is Nothing And Not Me.OldValue
Is Nothing) _
OrElse (Not editingControl. Text Is Nothing And Me.OldValue
Is Nothing) Then
RaiseEvent ColumnDirty(Me, New System.EventArg s)
End If
MyBase.ColumnSt artedEditing(ed itingControl)
End Sub
Protected MustOverride Function GetColumnTextAt Row(ByVal Source
As CurrencyManager , _
ByVal RowNum
As Integer) As Object
#End Region
#Region "Properties "
Protected Property CellControl() As Control
Get
Return mcellControl
End Get
Set(ByVal Value As Control)
mcellControl = Value
End Set
End Property
Protected Property RowNumber() As Integer
Get
Return mrowNum
End Get
Set(ByVal Value As Integer)
mrowNum = Value
End Set
End Property
Protected Property GridDataSource( ) As CurrencyManager
Get
Return msource
End Get
Set(ByVal Value As CurrencyManager )
msource = Value
End Set
End Property
Protected Property InEdit() As Boolean
Get
Return minEdit
End Get
Set(ByVal Value As Boolean)
minEdit = Value
End Set
End Property
Protected ReadOnly Property yMargin() As Integer
Get
Return myMargin
End Get
End Property
Protected ReadOnly Property xMargin() As Integer
Get
Return mxMargin
End Get
End Property
Protected Property OldValue() As Object
Get
Return moldVal
End Get
Set(ByVal Value As Object)
If Not Value Is System.DBNull.V alue Then
moldVal = Value
Else
moldVal = String.Empty
End If
End Set
End Property
Protected Property IsDirty() As Boolean
Get
Return mIsDirty
End Get
Set(ByVal Value As Boolean)
If Not mIsDirty = False Then
mIsDirty = Value
RaiseEvent ColumnDirty(Me, New System.EventArg s)
End If
End Set
End Property
#End Region
#Region "Subroutine s"
Protected Overrides Sub Abort(ByVal rowNum As Integer)
RollBack()
EndEdit()
Invalidate()
End Sub
Protected Overloads Overrides Sub Paint(ByVal g As
System.Drawing. Graphics, _
ByVal bounds As
System.Drawing. Rectangle, _
ByVal source As
System.Windows. Forms.CurrencyM anager, _
ByVal rowNum As Integer)
Paint(g, bounds, source, rowNum, False)
End Sub
Protected Overloads Overrides Sub Paint(ByVal g As
System.Drawing. Graphics, _
ByVal bounds As
System.Drawing. Rectangle, _
ByVal source As
System.Windows. Forms.CurrencyM anager, _
ByVal rowNum As Integer, _
ByVal alignToRight As
Boolean)
Dim Text As String = GetText(GetColu mnTextAtRow(sou rce,
rowNum))
'Dim BackBrush As Brush
'Dim ForeBrush As Brush
'If Me.DataGridTabl eStyle.DataGrid .IsSelected(row Num) Then
' BackBrush = New
SolidBrush(Me.D ataGridTableSty le.SelectionBac kColor)
' ForeBrush = New
SolidBrush(Me.D ataGridTableSty le.ForeColor)
'Else
' BackBrush = New
SolidBrush(Me.D ataGridTableSty le.BackColor)
' ForeBrush = New
SolidBrush(Me.D ataGridTableSty le.ForeColor)
'End If
PaintText(g, bounds, Text, alignToRight)
'PaintText(g, bounds, Text, BackBrush, ForeBrush,
alignToRight)
End Sub
Protected Overloads 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 Text As String = GetText(GetColu mnTextAtRow(Sou rce,
RowNum))
PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight)
End Sub
Protected Overloads Overrides Sub SetDataGridInCo lumn(ByVal
Value As DataGrid)
MyBase.SetDataG ridInColumn(Val ue)
If Not (mcellControl.P arent Is Value) Then
If Not (mcellControl.P arent Is Nothing) Then
mcellControl.Pa rent.Controls.R emove(mcellCont rol)
End If
End If
If Not (Value Is Nothing) Then
Value.Controls. Add(mcellContro l)
End Sub
Protected Overloads Overrides Sub UpdateUI(ByVal Source As
CurrencyManager , _
ByVal RowNum As
Integer, ByVal InstantText As String)
mcellControl.Te xt = GetText(GetColu mnTextAtRow(Sou rce,
RowNum))
If Not (InstantText Is Nothing) Then
mcellControl.Te xt = InstantText
End If
End Sub
Protected Overridable Sub EndEdit()
minEdit = False
Invalidate()
End Sub
Protected Overridable Sub RollBack()
mcellControl.Te xt = moldVal
End Sub
Protected Overridable Sub PaintText(ByVal g As Graphics, _
ByVal Bounds As Rectangle, _
ByVal Text As String, _
ByVal AlignToRight As Boolean)
Dim BackBrush As Brush = New
SolidBrush(Me.D ataGridTableSty le.BackColor)
Dim ForeBrush As Brush = New
SolidBrush(Me.D ataGridTableSty le.ForeColor)
PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight)
End Sub
Protected Overridable Sub PaintText(ByVal g As Graphics, _
ByVal TextBounds As Rectangle, _
ByVal Text As String, _
ByVal BackBrush As Brush, _
ByVal ForeBrush As Brush, _
ByVal AlignToRight As Boolean)
Dim Rect As Rectangle = TextBounds
Dim RectF As RectangleF = RectF.op_Implic it(Rect) ' Convert
to RectangleF
Dim Format As StringFormat = New StringFormat
If AlignToRight Then
Format.FormatFl ags =
StringFormatFla gs.DirectionRig htToLeft
End If
Select Case Me.Alignment
Case Is = HorizontalAlign ment.Left
Format.Alignmen t = StringAlignment .Near
Case Is = HorizontalAlign ment.Right
Format.Alignmen t = StringAlignment .Far
Case Is = HorizontalAlign ment.Center
Format.Alignmen t = StringAlignment .Center
End Select
Format.FormatFl ags = Format.FormatFl ags Or
StringFormatFla gs.NoWrap
g.FillRectangle (Brush:=BackBru sh, Rect:=Rect)
Rect.Offset(0, myMargin)
Rect.Height -= myMargin
g.DrawString(Te xt, Me.DataGridTabl eStyle.DataGrid .Font,
ForeBrush, RectF, Format)
Format.Dispose( )
End Sub
#End Region
#End Region
#Region "Public"
#Region "Events"
Public Event ColumnDirty(ByV al sender As Object, ByVal e As
System.EventArg s)
Public Event ColumnEdited(By Val sender As Object, ByVal e As
System.EventArg s)
#End Region
#End Region
End Class
#End Region
Public Class ExtendedDataGri dTextBoxColumn
Inherits ExtendedDataGri dColumnStyle
#Region "Private"
#Region "Properties "
Private WithEvents tb As TextBox
#End Region
#Region "Subroutine s"
Private Sub HideTextBox()
If tb.Focused Then
Me.DataGridTabl eStyle.DataGrid .Focus()
End If
tb.Visible = False
End Sub
Private Sub tb_TextChanged( ByVal sender As Object, ByVal e
As System.EventArg s) Handles tb.TextChanged
MyBase.ColumnSt artedEditing(tb )
End Sub
#End Region
#End Region
#Region "Protected"
#Region "Functions"
Protected Overrides Function Commit(ByVal dataSource As
System.Windows. Forms.CurrencyM anager, _
ByVal rowNum As Integer)
As Boolean
HideTextBox()
RowNumber = rowNum
GridDataSource = dataSource
If Not InEdit Then
Return True
End If
Try
Dim Value As Object = tb.Text
If NullText.Equals (Value) Then
Value = Convert.DBNull
End If
If Not Value = GetColumnTextAt Row(dataSource,
rowNum) Then
IsDirty = True
SetColumnValueA tRow(dataSource , rowNum, Value)
End If
Catch e As Exception
RollBack()
Return False
End Try
EndEdit()
Return True
End Function
Protected Overrides Function GetColumnTextAt Row(ByVal Source
As System.Windows. Forms.CurrencyM anager, ByVal RowNum As Integer) As Object
Dim value As Object = Me.GetColumnVal ueAtRow(Source,
RowNum)
If value Is System.DBNull.V alue Then
Return NullText
Else
Return value
End If
End Function
Protected Overrides Function GetMinimumHeigh t() As Integer
'Set the minimum height to the height of the combobox
Return tb.PreferredHei ght + yMargin
End Function
#End Region
#Region "Subroutine s"
Protected Overloads Overrides Sub Abort(ByVal RowNum As
Integer)
MyBase.Abort(Ro wNum)
HideTextBox()
End Sub
Protected Overloads Overrides Sub ConcedeFocus()
tb.Visible = False
End Sub
Protected Overloads Overrides Sub Edit(ByVal source As
System.Windows. Forms.CurrencyM anager, _
ByVal rowNum As
Integer, _
ByVal bounds As
System.Drawing. Rectangle, _
ByVal [readOnly] As
Boolean, _
ByVal instantText As
String, _
ByVal cellIsVisible
As Boolean)
GridDataSource = source
RowNumber = rowNum
tb.Text = String.Empty
Dim OriginalBounds As Rectangle = bounds
Dim txt As String
OldValue = GetColumnValueA tRow(source, rowNum)
If cellIsVisible Then
bounds.Offset(x Margin, yMargin)
bounds.Width -= xMargin * 2
bounds.Height -= yMargin
tb.Bounds = bounds
tb.Visible = True
Else
tb.Bounds = OriginalBounds
tb.Visible = False
End If
If Not instantText Is Nothing Then
tb.Text = instantText
Else
tb.Text = oldvalue
End If
tb.RightToLeft =
Me.DataGridTabl eStyle.DataGrid .RightToLeft
tb.Focus()
If instantText Is Nothing Then
tb.SelectAll()
Else
Dim [End] As Integer = tb.Text.Length
tb.Select([End], 0)
End If
If tb.Visible Then
DataGridTableSt yle.DataGrid.In validate(Origin alBounds)
End If
InEdit = True
End Sub
#End Region
#End Region
#Region "Public"
#Region "Properties "
Public ReadOnly Property TextBox() As TextBox
Get
Return tb
End Get
End Property
#End Region
#Region "Subroutine s"
Public Sub New()
tb = New TextBox
tb.Visible = False
CellControl = CType(tb, Control)
End Sub
#End Region
#End Region
End Class
Pat
"Mike McIntyre" wrote:
No bells ringing yet.
If you can share your DataGridColumnS tyle code post it here or send it to
me: mi****@getdotne tcode.com
and I will take a look.
Mike
"pmcguire" <pm******@discu ssions.microsof t.com> wrote in message
news:8E******** *************** ***********@mic rosoft.com... By default, your derived column should be colored (highlighted) when a
row
is selected in the DataGrid. Is this not happening?
No, this is NOT happening. Mind you, I have overridden a bunch of stuff
in
my derived DataGridColumnS tyles.
The DataGridColumnS tyle class has a property named DataGridTableSt yle
which
in turn has a DataGrid property which holds a refererence the DataGrid
hosting the DataGridColumnS tyle.
In fact I found the reference to the datagrid shortly after my first post.
"FORCING" the row to paint in the DataTableStyles .BackColor after testing
for
selection doesn't work, i.e. the DataGrid thinks that the row in question
is
not selected. It seems I have overridden something that would ordinarily
set
the IsSelected for the row.
Does this ring any bells?
Thanks,
Pat
"Mike McIntyre" wrote:
The DataGridColumnS tyle class has a property named DataGridTableSt yle
which
in turn has a DataGrid property which holds a refererence the DataGrid
hosting the DataGridColumnS tyle.
By default, your derived column should be colored (highlighted) when a
row
is selected in the DataGrid. Is this not happening? Or am I
misunderstandin g your question?
--
Mike
Mike McIntyre
Visual Basic MVP
www.getdotnetcode.com
"pmcguire" <pm******@discu ssions.microsof t.com> wrote in message
news:C6******** *************** ***********@mic rosoft.com...
>I have a DataGrid control for which I have also created several new
>extended
> DataGridColumnS tyles. They behave pretty nicely, but I can't figure
> out
> how
> to implement Selected Item formatting for them.
>
> In a plain vanilla DataGrid, when you click on the RowHeader, the
> appropriate row changes colors. I ASSUME this should be done in the
> Paint
> (or PaintText) override of the DataGridColumnS tyle in question. My
> problem
> is that I don't know how to retrieve the DataGrid of the
> DataGridColumnS tyle
> instance to test if the row is selected.
>
> Or, maybe this isn't the best way to do this. Any help?
>
> Thanks,
> --
> Pat