473,769 Members | 5,900 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Extended datagrid

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
Nov 21 '05 #1
13 2495
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

Nov 21 '05 #2
> 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


Nov 21 '05 #3
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


Nov 21 '05 #4
> "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.


This is not exactly true. While it IS true that clicking the rowheader for
row n does not appear to set datagrid.IsSele cted(n), I'm not sure that is
what happens in the vanilla DataGrid. I replaced one of my extended columns
in my test form with a vanilla column and now when I select a row, the
vanilla cell is highlighted while my various extended cells are not.
"pmcguire" wrote:
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


Nov 21 '05 #5
When the row header is clicked no particular cell is selected in the row.

When a cell is clicked, you now have an active CurrentCell in the DataGrid.

Just clarifying a bit...

When you click in a cell the colum
"pmcguire" <pm******@discu ssions.microsof t.com> wrote in message
news:41******** *************** ***********@mic rosoft.com...
"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.


This is not exactly true. While it IS true that clicking the rowheader
for
row n does not appear to set datagrid.IsSele cted(n), I'm not sure that is
what happens in the vanilla DataGrid. I replaced one of my extended
columns
in my test form with a vanilla column and now when I select a row, the
vanilla cell is highlighted while my various extended cells are not.
"pmcguire" wrote:
> 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
>
>
>

Nov 21 '05 #6
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


Nov 21 '05 #7
Pat,

I've also done some *Extremely* heavy modification to the standard
DataGrid object, and assocated column objects. Unlike you - I had to
provide the ability to select multiple rows and provide multiple
formats to those rows (ie Color selection and the like) based on user
preferences at the time of selection. I also needed to maintain Column
Selection, and specific Cell selection and highlighting.

For those reasons, and for a similar question you are requesting - I
handled all of the user interaction and selection on my own - without
the use (or betrayal) of the isSelected Property of elements.

This can be easily handled by simply overriding the MouseDown event on
the DataGrid object - and testing to determine what type of object you
are currently attempting to select - like so:

Private Sub MyGrid_MouseDow n(ByVal sender As Object, ByVal e As
System.Windows. Forms.MouseEven tArgs) Handles MyBase.MouseDow n
Try
Dim x As HitTestInfo = Me.HitTest(New Point(e.X, e.Y))
Dim ts As DataGridColumnS tyle =
Me.m_BaseStyle. GridColumnStyle s.Item(x.Column )

Select Case x.Type
Case DataGrid.HitTes tType.Cell
Case DataGrid.HitTes tType.ColumnHea der
Case DataGrid.HitTes tType.RowHeader
Case DataGrid.HitTes tType.Caption
Case DataGrid.HitTes tType.ColumnRes ize
Case DataGrid.HitTes tType.None
Case DataGrid.HitTes tType.ParentRow s
Case DataGrid.HitTes tType.RowResize
End Select
End Sub

Within the handling of these feature (i only used the cell, and column
header cases) you can track the setting and removing of highlights.
This was handled in my Grid by keeping a sorted list object that had a
key index for the rows as its key - and a highlight color object (with
a row,column integer). The value of the row and column identifies what
is highlighted. For example -1,2 means column 2 is highlighted. 2,-1
means row 2 is highlighted, and 2,2 means cell 2,2 is highlighted.

Painting of the columns is then handled in an overload of the Paint
method in a custom DataGridTextBox Column. When the cells are painted,
each cell checks for a custom highlight (from the arraylist) by
requesting that from the parent grid.

Its alot to take in - but with your development status to this point -
you should be able to gather what I have stated. If you dont need to go
to that depth, you can handle the RowHeader clicked case in the
mousedown stub i provided. That should get you moving along.

Kevin M. Schreiner
VP Software Architecture
Business Intelligence Force (bi4ce)

Nov 21 '05 #8
Sorry that I've now spawned an extra thread.
When the row header is clicked no particular cell is selected in the row.

When a cell is clicked, you now have an active CurrentCell in the DataGrid.
Yes, I understand. I AM talking about entire rows. I click the rowheader
and only one cell (the one belonging to the vanilla DataGridColumnS tyle
column) in the selected row gets highlighted.

"Mike McIntyre" wrote:
When the row header is clicked no particular cell is selected in the row.

When a cell is clicked, you now have an active CurrentCell in the DataGrid.

Just clarifying a bit...

When you click in a cell the colum
"pmcguire" <pm******@discu ssions.microsof t.com> wrote in message
news:41******** *************** ***********@mic rosoft.com...
"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.


This is not exactly true. While it IS true that clicking the rowheader
for
row n does not appear to set datagrid.IsSele cted(n), I'm not sure that is
what happens in the vanilla DataGrid. I replaced one of my extended
columns
in my test form with a vanilla column and now when I select a row, the
vanilla cell is highlighted while my various extended cells are not.
"pmcguire" wrote:
> 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
>
>
>


Nov 21 '05 #9
Hmm. Interesting. Yes I am sort of starting to come to the conclusion that
I am going to have to capture the MouseUp event (Why did you use MouseDown?).
But it irks me that I have to do that, it seems ... a little icky (what
about Keyboard selection, etc.). It seems that it would be preferable to be
able to rely on a RowSelected event. But I guess that doesn't exist.

Thanks,
"kevin" wrote:
Pat,

I've also done some *Extremely* heavy modification to the standard
DataGrid object, and assocated column objects. Unlike you - I had to
provide the ability to select multiple rows and provide multiple
formats to those rows (ie Color selection and the like) based on user
preferences at the time of selection. I also needed to maintain Column
Selection, and specific Cell selection and highlighting.

For those reasons, and for a similar question you are requesting - I
handled all of the user interaction and selection on my own - without
the use (or betrayal) of the isSelected Property of elements.

This can be easily handled by simply overriding the MouseDown event on
the DataGrid object - and testing to determine what type of object you
are currently attempting to select - like so:

Private Sub MyGrid_MouseDow n(ByVal sender As Object, ByVal e As
System.Windows. Forms.MouseEven tArgs) Handles MyBase.MouseDow n
Try
Dim x As HitTestInfo = Me.HitTest(New Point(e.X, e.Y))
Dim ts As DataGridColumnS tyle =
Me.m_BaseStyle. GridColumnStyle s.Item(x.Column )

Select Case x.Type
Case DataGrid.HitTes tType.Cell
Case DataGrid.HitTes tType.ColumnHea der
Case DataGrid.HitTes tType.RowHeader
Case DataGrid.HitTes tType.Caption
Case DataGrid.HitTes tType.ColumnRes ize
Case DataGrid.HitTes tType.None
Case DataGrid.HitTes tType.ParentRow s
Case DataGrid.HitTes tType.RowResize
End Select
End Sub

Within the handling of these feature (i only used the cell, and column
header cases) you can track the setting and removing of highlights.
This was handled in my Grid by keeping a sorted list object that had a
key index for the rows as its key - and a highlight color object (with
a row,column integer). The value of the row and column identifies what
is highlighted. For example -1,2 means column 2 is highlighted. 2,-1
means row 2 is highlighted, and 2,2 means cell 2,2 is highlighted.

Painting of the columns is then handled in an overload of the Paint
method in a custom DataGridTextBox Column. When the cells are painted,
each cell checks for a custom highlight (from the arraylist) by
requesting that from the parent grid.

Its alot to take in - but with your development status to this point -
you should be able to gather what I have stated. If you dont need to go
to that depth, you can handle the RowHeader clicked case in the
mousedown stub i provided. That should get you moving along.

Kevin M. Schreiner
VP Software Architecture
Business Intelligence Force (bi4ce)

Nov 21 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
983
by: Tiago Marques | last post by:
I'm trying to use this component but I don't know how to populate the combobox in the datagrid. I'd like to have a datasource related to it. Thanks for any help!
0
273
by: Elad Gutman | last post by:
Hi, I wanna buy an advanced 3rd party DataGrid for windows forms .Net framework. The best tool for me will be a grid inherits from the 'Windows.Forms.DataGrid' object, meaning that I will have a full compatibility with the object I'm using today. Any recommendations are most welcomed.
0
1161
by: Richard | last post by:
Does anyone have a best practices object model for the properties and methods that would typically be involved with the GDI painting, rendering, etc. aspect of this control. Classes surely to be involved will be DataGridTableStyle, DataGridColumnStyle, GridColumnStyles Paint, Brush, Fonts, DataGridTextBoxColumn, DataGridBoolColumn, PointToClient, TableStyles, etc. Basically we want to change row colors, fonts, borders, etc. based on...
0
1010
by: James | last post by:
Hi, We are looking for a way to select multiple rows in a bounded datagrid. The extended selection needs to work as same as an MSAccess list box control. Can anyone help? Thx in advance. James
1
1039
by: ADavidson | last post by:
Is there a way to add a textbox that is the full length of a datagrid below the columns of the grid? Or is there a different control to achieve this? Basically: Col1 | Col2 | Col3 Line 1 1 | 2 | 3 line 1 text box......... Line 2 2 | 2 | 3
3
1077
by: Trint Smith | last post by:
I need a webcontrol datagrid with extended capabilities...to show thumbnails and hyperlinks..etc. Like this one does that is just a windowscontrol: http://dotnet.leadit.be/extendeddatagrid But I need mine for a webproject. Any help is appreciated. Thanks, Trint
1
1401
by: Richard | last post by:
Does anyone have a best practices object model for the properties and methods that would typically be involved with the GDI painting, rendering, etc. aspect of this control. Classes surely to be involved will be DataGridTableStyle, DataGridColumnStyle, GridColumnStyles Paint, Brush, Fonts, DataGridTextBoxColumn, DataGridBoolColumn, PointToClient, TableStyles, etc. Basically we want to change row colors, fonts, borders, etc. based on the...
0
1191
by: Badshah | last post by:
Hello All, I am using extended data grid (from Leadit) in my C# winforms application. I have written some serial numbers on the rwo header of the extended data grid. Problem is when I scroll the horizontal scrolbar, the row headers do not stay still and the row header column does not freeze and it is not possible to see on which row I am, as the serial numbers are not visible.
1
1529
by: VanZandt | last post by:
I have a class(dll) that extends winform datagrid to provide link column in vb.net. I have managed to create a datagrid in c# winforms that shows link in one of the column but when I try to create a EventHandler I get a compilation error: "Method 'DataGridLink.Form1.cs_LinkClicked does not match delegate" can anyone please help? Thanks for all the help. here is my code: using System; using System.Drawing; using System.Collections;
0
9423
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10210
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10043
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
9990
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8869
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
5298
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5446
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
3956
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
3561
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.