I understand it is impossible, but still curious to know "Can I freeze
several column in the datagrid, the user can only scroll the first 3 columns
(not verical), for the rest of the coulumn, it is freeze. 6 2721
Try use two datagrids: one is for freeze, another is for scroll.
"Agnes" wrote: I understand it is impossible, but still curious to know "Can I freeze several column in the datagrid, the user can only scroll the first 3 columns (not verical), for the rest of the coulumn, it is freeze.
Hi,
Here is a column style that locks a column on the datagrid. It is
still under development. basically if you set the locked property to true
it places a panel over the datagrid that has the locked column drawn on it.
Currently it only will lock the first column.
Imports System.Drawing.Drawing2D
Public Class ColoredGridColumn
Inherits DataGridTextBoxColumn
Dim mForeColor As Color = Color.Black
Dim mBackColor As Color = Color.White
Dim WithEvents mctrl As DblBufferPanel
Dim WithEvents dg As DataGrid
Dim pt As New Point
Dim bPanelOnly As Boolean = False
Dim cm As CurrencyManager
Dim ar As Boolean
Private Class DblBufferPanel
Inherits Panel
Public Sub New()
Me.SetStyle(ControlStyles.DoubleBuffer, True)
End Sub
End Class
Public Property ForeColor() As Color
Get
Return mForeColor
End Get
Set(ByVal Value As Color)
mForeColor = Value
End Set
End Property
Public Property BackColor() As Color
Get
Return mBackColor
End Get
Set(ByVal Value As Color)
mBackColor = Value
End Set
End Property
Public Property Locked() As Boolean
Get
Return Not mctrl Is Nothing
End Get
Set(ByVal Value As Boolean)
If Value = False Then
mctrl = Nothing
Else
mctrl = New DblBufferPanel
End If
End Set
End Property
Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics,
ByVal bounds As System.Drawing.Rectangle, ByVal source As
System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal
backBrush As System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush,
ByVal alignToRight As Boolean)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Static bPainted As Boolean = False
If Not bPainted And Not (mctrl Is Nothing) Then
dg = Me.DataGridTableStyle.DataGrid
dg.Parent.Controls.Add(mctrl)
MovePanel()
mctrl.BringToFront()
pt = dg.GetCellBounds(0, 0).Location
If TypeOf dg.DataSource Is DataTable Then
AddHandler DirectCast(dg.DataSource, DataTable).DefaultView.ListChanged,
AddressOf dv_ListChanged
ElseIf TypeOf dg.DataSource Is DataView Then
AddHandler DirectCast(dg.DataSource, DataView).ListChanged, AddressOf
dv_ListChanged
End If
End If
cm = source
ar = alignToRight
bPainted = True
If Me.DataGridTableStyle.DataGrid.IsSelected(rowNum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore)
Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F,
0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F,
1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If Not bPanelOnly Then
MyBase.Paint(g, bounds, source, rowNum, brBack, brFore, alignToRight)
End If
If Not (mctrl Is Nothing) Then
' if there is another control to draw on move the bounds to the right edge
if htere is not then it will ignore that directive right? yesgot oitf the
control
'mctrl.BackgroundImage = bm
PaintRow(mctrl.CreateGraphics, bounds, rowNum)
End If
If Me.GetColumnValueAtRow(source, rowNum).ToString = "Davolio" Then
Me.DataGridTableStyle.DataGrid.Select(rowNum)
End If
End Sub
Public Shadows Sub BeginUpdate()
MyBase.BeginUpdate()
End Sub
Public Shadows Sub EndUpdate()
MyBase.EndUpdate()
End Sub
Protected Overloads Overrides Sub Edit(ByVal source As
System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds
As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText
As String, ByVal cellIsVisible As Boolean)
MyBase.Edit(source, rowNum, bounds, [readOnly], instantText, cellIsVisible)
MyBase.TextBox.ForeColor = ForeColor()
MyBase.TextBox.BackColor = BackColor
End Sub
Public Sub New()
End Sub
Private Sub dg_Scroll(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dg.Scroll
Trace.WriteLine("Scroll")
RedrawPanel()
End Sub
Private Sub MovePanel()
mctrl.Location = New Point(dg.Left + dg.RowHeaderWidth + 2, dg.Top + 21)
Dim intFactor As Integer = SystemInformation.HorizontalScrollBarHeight
For Each ctrl As Control In Me.DataGridTableStyle.DataGrid.Controls
If TypeOf ctrl Is HScrollBar Then
If Not DirectCast(ctrl, HScrollBar).Visible Then intFactor = 0
End If
Next
mctrl.Height = dg.Height - 21 - intFactor - 2
End Sub
Private Sub dg_Move(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dg.Move
MovePanel()
End Sub
Private Sub PreparePanel()
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = mctrl.CreateGraphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Catch
End Try
End Sub
Private Sub dv_ListChanged(ByVal sender As Object, ByVal e As
System.ComponentModel.ListChangedEventArgs)
'PreparePanel()
RedrawPanel()
End Sub
Private Sub dg_VisibleChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles dg.VisibleChanged
Try
mctrl.Visible = dg.Visible
Catch ex As Exception
End Try
End Sub
Private Sub dg_SizeChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles dg.SizeChanged
MovePanel()
RedrawPanel()
End Sub
Private Sub RedrawPanel()
Static oldTop As Integer = 0
If Not mctrl Is Nothing And dg.VisibleRowCount > 0 Then
Application.DoEvents()
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row,
dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x,
dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
bPanelOnly = False
End If
End Sub
Private Sub dg_Resize(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dg.Resize
MovePanel()
End Sub
Private Sub mctrl_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles mctrl.Paint
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = e.Graphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Debug.WriteLine("Panel Paint")
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Dim oldTop As Integer
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row,
dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x,
dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
Catch
End Try
End Sub
Private Sub PaintRow(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal
rownum As Integer)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Dim bounds2 As New Rectangle(0, bounds.Y - 21, bounds.Width, bounds.Height)
If Me.DataGridTableStyle.DataGrid.IsSelected(rownum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore)
Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F,
0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F,
1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If mctrl.Width <> Me.Width Then mctrl.Width = Me.Width
MyBase.Paint(g, bounds2, cm, rownum, _
brBack, brFore, ar)
If rownum = cm.Count - 1 Then
Dim br As New SolidBrush(Me.DataGridTableStyle.DataGrid.Backgrou ndColor)
g.FillRectangle(br, 0, bounds2.Bottom + 1, mctrl.Width, _
mctrl.Height - bounds2.Bottom - 1)
End If
End Sub
End Class
Ken
-------------------------------
"Agnes" <ag***@dynamictech.com.hk> wrote in message
news:uC**************@TK2MSFTNGP10.phx.gbl...
I understand it is impossible, but still curious to know "Can I freeze
several column in the datagrid, the user can only scroll the first 3 columns
(not verical), for the rest of the coulumn, it is freeze.
This is nothing short of amazing work Ken.
"Ken Tucker [MVP]" <vb***@bellsouth.net> wrote in message
news:vb***@bellsouth.net: Hi,
Here is a column style that locks a column on the datagrid. It is
still under development. basically if you set the locked property to true
it places a panel over the datagrid that has the locked column drawn on it. Currently it only will lock the first column.
Imports System.Drawing.Drawing2D
Public Class ColoredGridColumn
Inherits DataGridTextBoxColumn
Dim mForeColor As Color = Color.Black
Dim mBackColor As Color = Color.White
Dim WithEvents mctrl As DblBufferPanel
Dim WithEvents dg As DataGrid
Dim pt As New Point
Dim bPanelOnly As Boolean = False
Dim cm As CurrencyManager
Dim ar As Boolean
Private Class DblBufferPanel
Inherits Panel
Public Sub New()
Me.SetStyle(ControlStyles.DoubleBuffer, True)
End Sub
End Class
Public Property ForeColor() As Color
Get
Return mForeColor
End Get
Set(ByVal Value As Color)
mForeColor = Value
End Set
End Property
Public Property BackColor() As Color
Get
Return mBackColor
End Get
Set(ByVal Value As Color)
mBackColor = Value
End Set
End Property
Public Property Locked() As Boolean
Get
Return Not mctrl Is Nothing
End Get
Set(ByVal Value As Boolean)
If Value = False Then
mctrl = Nothing
Else
mctrl = New DblBufferPanel
End If
End Set
End Property
Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush, ByVal alignToRight As Boolean)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Static bPainted As Boolean = False
If Not bPainted And Not (mctrl Is Nothing) Then
dg = Me.DataGridTableStyle.DataGrid
dg.Parent.Controls.Add(mctrl)
MovePanel()
mctrl.BringToFront()
pt = dg.GetCellBounds(0, 0).Location
If TypeOf dg.DataSource Is DataTable Then
AddHandler DirectCast(dg.DataSource, DataTable).DefaultView.ListChanged,
AddressOf dv_ListChanged
ElseIf TypeOf dg.DataSource Is DataView Then
AddHandler DirectCast(dg.DataSource, DataView).ListChanged, AddressOf dv_ListChanged
End If
End If
cm = source
ar = alignToRight
bPainted = True
If Me.DataGridTableStyle.DataGrid.IsSelected(rowNum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F,
0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F,
1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If Not bPanelOnly Then
MyBase.Paint(g, bounds, source, rowNum, brBack, brFore, alignToRight)
End If
If Not (mctrl Is Nothing) Then
' if there is another control to draw on move the bounds to the right edge
if htere is not then it will ignore that directive right? yesgot oitf the
control
'mctrl.BackgroundImage = bm
PaintRow(mctrl.CreateGraphics, bounds, rowNum)
End If
If Me.GetColumnValueAtRow(source, rowNum).ToString = "Davolio" Then
Me.DataGridTableStyle.DataGrid.Select(rowNum)
End If
End Sub
Public Shadows Sub BeginUpdate()
MyBase.BeginUpdate()
End Sub
Public Shadows Sub EndUpdate()
MyBase.EndUpdate()
End Sub
Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
MyBase.Edit(source, rowNum, bounds, [readOnly], instantText, cellIsVisible)
MyBase.TextBox.ForeColor = ForeColor()
MyBase.TextBox.BackColor = BackColor
End Sub
Public Sub New()
End Sub
Private Sub dg_Scroll(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dg.Scroll
Trace.WriteLine("Scroll")
RedrawPanel()
End Sub
Private Sub MovePanel()
mctrl.Location = New Point(dg.Left + dg.RowHeaderWidth + 2, dg.Top + 21)
Dim intFactor As Integer = SystemInformation.HorizontalScrollBarHeight
For Each ctrl As Control In Me.DataGridTableStyle.DataGrid.Controls
If TypeOf ctrl Is HScrollBar Then
If Not DirectCast(ctrl, HScrollBar).Visible Then intFactor = 0
End If
Next
mctrl.Height = dg.Height - 21 - intFactor - 2
End Sub
Private Sub dg_Move(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dg.Move
MovePanel()
End Sub
Private Sub PreparePanel()
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = mctrl.CreateGraphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Catch
End Try
End Sub
Private Sub dv_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs)
'PreparePanel()
RedrawPanel()
End Sub
Private Sub dg_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.VisibleChanged
Try
mctrl.Visible = dg.Visible
Catch ex As Exception
End Try
End Sub
Private Sub dg_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.SizeChanged
MovePanel()
RedrawPanel()
End Sub
Private Sub RedrawPanel()
Static oldTop As Integer = 0
If Not mctrl Is Nothing And dg.VisibleRowCount > 0 Then
Application.DoEvents()
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row,
dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
bPanelOnly = False
End If
End Sub
Private Sub dg_Resize(ByVal sender As Object, ByVal e As System.EventArgs)
Handles dg.Resize
MovePanel()
End Sub
Private Sub mctrl_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles mctrl.Paint
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = e.Graphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Debug.WriteLine("Panel Paint")
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Dim oldTop As Integer
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row,
dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
Catch
End Try
End Sub
Private Sub PaintRow(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal
rownum As Integer)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Dim bounds2 As New Rectangle(0, bounds.Y - 21, bounds.Width, bounds.Height)
If Me.DataGridTableStyle.DataGrid.IsSelected(rownum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F,
0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F,
1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If mctrl.Width <> Me.Width Then mctrl.Width = Me.Width
MyBase.Paint(g, bounds2, cm, rownum, _
brBack, brFore, ar)
If rownum = cm.Count - 1 Then
Dim br As New SolidBrush(Me.DataGridTableStyle.DataGrid.Backgrou ndColor)
g.FillRectangle(br, 0, bounds2.Bottom + 1, mctrl.Width, _
mctrl.Height - bounds2.Bottom - 1)
End If
End Sub
End Class Ken
-------------------------------
"Agnes" <ag***@dynamictech.com.hk> wrote in message news:uC**************@TK2MSFTNGP10.phx.gbl... I understand it is impossible, but still curious to know "Can I freeze several column in the datagrid, the user can only scroll the first 3 columns (not verical), for the rest of the coulumn, it is freeze.
I am looking for the same function in a web application (using a web form
data grid). The application uses C# and heaps of data grids that have the
first one or two columns populated with data that would be nice to have
remain visable as the user scrolls horizontally. Of course, it would also be
nice to have the headings remain visable as the user scrolls down the grid as
well.
I had a quick look at Ken's code (although I am not a VB person), but it
seems the DataGridTextBoxColumn is only part of the Windows Form data grid.
So was wondering if anyone can give me any help with this.
Cheers,
"Ken Tucker [MVP]" wrote: Hi,
Here is a column style that locks a column on the datagrid. It is still under development. basically if you set the locked property to true it places a panel over the datagrid that has the locked column drawn on it. Currently it only will lock the first column.
Imports System.Drawing.Drawing2D
Public Class ColoredGridColumn
Inherits DataGridTextBoxColumn
Dim mForeColor As Color = Color.Black
Dim mBackColor As Color = Color.White
Dim WithEvents mctrl As DblBufferPanel
Dim WithEvents dg As DataGrid
Dim pt As New Point
Dim bPanelOnly As Boolean = False
Dim cm As CurrencyManager
Dim ar As Boolean
Private Class DblBufferPanel
Inherits Panel
Public Sub New()
Me.SetStyle(ControlStyles.DoubleBuffer, True)
End Sub
End Class
Public Property ForeColor() As Color
Get
Return mForeColor
End Get
Set(ByVal Value As Color)
mForeColor = Value
End Set
End Property
Public Property BackColor() As Color
Get
Return mBackColor
End Get
Set(ByVal Value As Color)
mBackColor = Value
End Set
End Property
Public Property Locked() As Boolean
Get
Return Not mctrl Is Nothing
End Get
Set(ByVal Value As Boolean)
If Value = False Then
mctrl = Nothing
Else
mctrl = New DblBufferPanel
End If
End Set
End Property
Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush, ByVal alignToRight As Boolean)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Static bPainted As Boolean = False
If Not bPainted And Not (mctrl Is Nothing) Then
dg = Me.DataGridTableStyle.DataGrid
dg.Parent.Controls.Add(mctrl)
MovePanel()
mctrl.BringToFront()
pt = dg.GetCellBounds(0, 0).Location
If TypeOf dg.DataSource Is DataTable Then
AddHandler DirectCast(dg.DataSource, DataTable).DefaultView.ListChanged, AddressOf dv_ListChanged
ElseIf TypeOf dg.DataSource Is DataView Then
AddHandler DirectCast(dg.DataSource, DataView).ListChanged, AddressOf dv_ListChanged
End If
End If
cm = source
ar = alignToRight
bPainted = True
If Me.DataGridTableStyle.DataGrid.IsSelected(rowNum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F, 0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F, 1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If Not bPanelOnly Then
MyBase.Paint(g, bounds, source, rowNum, brBack, brFore, alignToRight)
End If
If Not (mctrl Is Nothing) Then
' if there is another control to draw on move the bounds to the right edge if htere is not then it will ignore that directive right? yesgot oitf the control
'mctrl.BackgroundImage = bm
PaintRow(mctrl.CreateGraphics, bounds, rowNum)
End If
If Me.GetColumnValueAtRow(source, rowNum).ToString = "Davolio" Then
Me.DataGridTableStyle.DataGrid.Select(rowNum)
End If
End Sub
Public Shadows Sub BeginUpdate()
MyBase.BeginUpdate()
End Sub
Public Shadows Sub EndUpdate()
MyBase.EndUpdate()
End Sub
Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
MyBase.Edit(source, rowNum, bounds, [readOnly], instantText, cellIsVisible)
MyBase.TextBox.ForeColor = ForeColor()
MyBase.TextBox.BackColor = BackColor
End Sub
Public Sub New()
End Sub
Private Sub dg_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Scroll
Trace.WriteLine("Scroll")
RedrawPanel()
End Sub
Private Sub MovePanel()
mctrl.Location = New Point(dg.Left + dg.RowHeaderWidth + 2, dg.Top + 21)
Dim intFactor As Integer = SystemInformation.HorizontalScrollBarHeight
For Each ctrl As Control In Me.DataGridTableStyle.DataGrid.Controls
If TypeOf ctrl Is HScrollBar Then
If Not DirectCast(ctrl, HScrollBar).Visible Then intFactor = 0
End If
Next
mctrl.Height = dg.Height - 21 - intFactor - 2
End Sub
Private Sub dg_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Move
MovePanel()
End Sub
Private Sub PreparePanel()
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = mctrl.CreateGraphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Catch
End Try
End Sub
Private Sub dv_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs)
'PreparePanel()
RedrawPanel()
End Sub
Private Sub dg_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.VisibleChanged
Try
mctrl.Visible = dg.Visible
Catch ex As Exception
End Try
End Sub
Private Sub dg_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.SizeChanged
MovePanel()
RedrawPanel()
End Sub
Private Sub RedrawPanel()
Static oldTop As Integer = 0
If Not mctrl Is Nothing And dg.VisibleRowCount > 0 Then
Application.DoEvents()
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row, dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
bPanelOnly = False
End If
End Sub
Private Sub dg_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Resize
MovePanel()
End Sub
Private Sub mctrl_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles mctrl.Paint
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = e.Graphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Debug.WriteLine("Panel Paint")
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Dim oldTop As Integer
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row, dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
Catch
End Try
End Sub
Private Sub PaintRow(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal rownum As Integer)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Dim bounds2 As New Rectangle(0, bounds.Y - 21, bounds.Width, bounds.Height)
If Me.DataGridTableStyle.DataGrid.IsSelected(rownum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F, 0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F, 1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If mctrl.Width <> Me.Width Then mctrl.Width = Me.Width
MyBase.Paint(g, bounds2, cm, rownum, _
brBack, brFore, ar)
If rownum = cm.Count - 1 Then
Dim br As New SolidBrush(Me.DataGridTableStyle.DataGrid.Backgrou ndColor)
g.FillRectangle(br, 0, bounds2.Bottom + 1, mctrl.Width, _
mctrl.Height - bounds2.Bottom - 1)
End If
End Sub
End Class Ken
-------------------------------
"Agnes" <ag***@dynamictech.com.hk> wrote in message news:uC**************@TK2MSFTNGP10.phx.gbl... I understand it is impossible, but still curious to know "Can I freeze several column in the datagrid, the user can only scroll the first 3 columns (not verical), for the rest of the coulumn, it is freeze.
Hi James,
For a web application you'd do this with client script: http://www.codeproject.com/aspnet/Fr...neDatagrid.asp
Marcie
On Sat, 9 Apr 2005 23:41:01 -0700, "James"
<Ka***********@community.nospam> wrote: I am looking for the same function in a web application (using a web form data grid). The application uses C# and heaps of data grids that have the first one or two columns populated with data that would be nice to have remain visable as the user scrolls horizontally. Of course, it would also be nice to have the headings remain visable as the user scrolls down the grid as well.
I had a quick look at Ken's code (although I am not a VB person), but it seems the DataGridTextBoxColumn is only part of the Windows Form data grid. So was wondering if anyone can give me any help with this.
Cheers,
"Ken Tucker [MVP]" wrote:
Hi,
Here is a column style that locks a column on the datagrid. It is still under development. basically if you set the locked property to true it places a panel over the datagrid that has the locked column drawn on it. Currently it only will lock the first column.
Imports System.Drawing.Drawing2D
Public Class ColoredGridColumn
Inherits DataGridTextBoxColumn
Dim mForeColor As Color = Color.Black
Dim mBackColor As Color = Color.White
Dim WithEvents mctrl As DblBufferPanel
Dim WithEvents dg As DataGrid
Dim pt As New Point
Dim bPanelOnly As Boolean = False
Dim cm As CurrencyManager
Dim ar As Boolean
Private Class DblBufferPanel
Inherits Panel
Public Sub New()
Me.SetStyle(ControlStyles.DoubleBuffer, True)
End Sub
End Class
Public Property ForeColor() As Color
Get
Return mForeColor
End Get
Set(ByVal Value As Color)
mForeColor = Value
End Set
End Property
Public Property BackColor() As Color
Get
Return mBackColor
End Get
Set(ByVal Value As Color)
mBackColor = Value
End Set
End Property
Public Property Locked() As Boolean
Get
Return Not mctrl Is Nothing
End Get
Set(ByVal Value As Boolean)
If Value = False Then
mctrl = Nothing
Else
mctrl = New DblBufferPanel
End If
End Set
End Property
Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush, ByVal alignToRight As Boolean)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Static bPainted As Boolean = False
If Not bPainted And Not (mctrl Is Nothing) Then
dg = Me.DataGridTableStyle.DataGrid
dg.Parent.Controls.Add(mctrl)
MovePanel()
mctrl.BringToFront()
pt = dg.GetCellBounds(0, 0).Location
If TypeOf dg.DataSource Is DataTable Then
AddHandler DirectCast(dg.DataSource, DataTable).DefaultView.ListChanged, AddressOf dv_ListChanged
ElseIf TypeOf dg.DataSource Is DataView Then
AddHandler DirectCast(dg.DataSource, DataView).ListChanged, AddressOf dv_ListChanged
End If
End If
cm = source
ar = alignToRight
bPainted = True
If Me.DataGridTableStyle.DataGrid.IsSelected(rowNum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F, 0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F, 1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If Not bPanelOnly Then
MyBase.Paint(g, bounds, source, rowNum, brBack, brFore, alignToRight)
End If
If Not (mctrl Is Nothing) Then
' if there is another control to draw on move the bounds to the right edge if htere is not then it will ignore that directive right? yesgot oitf the control
'mctrl.BackgroundImage = bm
PaintRow(mctrl.CreateGraphics, bounds, rowNum)
End If
If Me.GetColumnValueAtRow(source, rowNum).ToString = "Davolio" Then
Me.DataGridTableStyle.DataGrid.Select(rowNum)
End If
End Sub
Public Shadows Sub BeginUpdate()
MyBase.BeginUpdate()
End Sub
Public Shadows Sub EndUpdate()
MyBase.EndUpdate()
End Sub
Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
MyBase.Edit(source, rowNum, bounds, [readOnly], instantText, cellIsVisible)
MyBase.TextBox.ForeColor = ForeColor()
MyBase.TextBox.BackColor = BackColor
End Sub
Public Sub New()
End Sub
Private Sub dg_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Scroll
Trace.WriteLine("Scroll")
RedrawPanel()
End Sub
Private Sub MovePanel()
mctrl.Location = New Point(dg.Left + dg.RowHeaderWidth + 2, dg.Top + 21)
Dim intFactor As Integer = SystemInformation.HorizontalScrollBarHeight
For Each ctrl As Control In Me.DataGridTableStyle.DataGrid.Controls
If TypeOf ctrl Is HScrollBar Then
If Not DirectCast(ctrl, HScrollBar).Visible Then intFactor = 0
End If
Next
mctrl.Height = dg.Height - 21 - intFactor - 2
End Sub
Private Sub dg_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Move
MovePanel()
End Sub
Private Sub PreparePanel()
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = mctrl.CreateGraphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Catch
End Try
End Sub
Private Sub dv_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs)
'PreparePanel()
RedrawPanel()
End Sub
Private Sub dg_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.VisibleChanged
Try
mctrl.Visible = dg.Visible
Catch ex As Exception
End Try
End Sub
Private Sub dg_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.SizeChanged
MovePanel()
RedrawPanel()
End Sub
Private Sub RedrawPanel()
Static oldTop As Integer = 0
If Not mctrl Is Nothing And dg.VisibleRowCount > 0 Then
Application.DoEvents()
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row, dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
bPanelOnly = False
End If
End Sub
Private Sub dg_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Resize
MovePanel()
End Sub
Private Sub mctrl_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles mctrl.Paint
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = e.Graphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Debug.WriteLine("Panel Paint")
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Dim oldTop As Integer
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row, dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
Catch
End Try
End Sub
Private Sub PaintRow(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal rownum As Integer)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Dim bounds2 As New Rectangle(0, bounds.Y - 21, bounds.Width, bounds.Height)
If Me.DataGridTableStyle.DataGrid.IsSelected(rownum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F, 0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F, 1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If mctrl.Width <> Me.Width Then mctrl.Width = Me.Width
MyBase.Paint(g, bounds2, cm, rownum, _
brBack, brFore, ar)
If rownum = cm.Count - 1 Then
Dim br As New SolidBrush(Me.DataGridTableStyle.DataGrid.Backgrou ndColor)
g.FillRectangle(br, 0, bounds2.Bottom + 1, mctrl.Width, _
mctrl.Height - bounds2.Bottom - 1)
End If
End Sub
End Class Ken
-------------------------------
"Agnes" <ag***@dynamictech.com.hk> wrote in message news:uC**************@TK2MSFTNGP10.phx.gbl... I understand it is impossible, but still curious to know "Can I freeze several column in the datagrid, the user can only scroll the first 3 columns (not verical), for the rest of the coulumn, it is freeze.
Thanks Marcie, I have had a look at the link and will try what it suggests
today. Thank you for the kindness to take the time to reply and help.
Cheers,
Jamie (James)
"Marcie Jones" wrote: Hi James, For a web application you'd do this with client script: http://www.codeproject.com/aspnet/Fr...neDatagrid.asp
Marcie
On Sat, 9 Apr 2005 23:41:01 -0700, "James" <Ka***********@community.nospam> wrote:
I am looking for the same function in a web application (using a web form data grid). The application uses C# and heaps of data grids that have the first one or two columns populated with data that would be nice to have remain visable as the user scrolls horizontally. Of course, it would also be nice to have the headings remain visable as the user scrolls down the grid as well.
I had a quick look at Ken's code (although I am not a VB person), but it seems the DataGridTextBoxColumn is only part of the Windows Form data grid. So was wondering if anyone can give me any help with this.
Cheers,
"Ken Tucker [MVP]" wrote:
Hi,
Here is a column style that locks a column on the datagrid. It is still under development. basically if you set the locked property to true it places a panel over the datagrid that has the locked column drawn on it. Currently it only will lock the first column.
Imports System.Drawing.Drawing2D
Public Class ColoredGridColumn
Inherits DataGridTextBoxColumn
Dim mForeColor As Color = Color.Black
Dim mBackColor As Color = Color.White
Dim WithEvents mctrl As DblBufferPanel
Dim WithEvents dg As DataGrid
Dim pt As New Point
Dim bPanelOnly As Boolean = False
Dim cm As CurrencyManager
Dim ar As Boolean
Private Class DblBufferPanel
Inherits Panel
Public Sub New()
Me.SetStyle(ControlStyles.DoubleBuffer, True)
End Sub
End Class
Public Property ForeColor() As Color
Get
Return mForeColor
End Get
Set(ByVal Value As Color)
mForeColor = Value
End Set
End Property
Public Property BackColor() As Color
Get
Return mBackColor
End Get
Set(ByVal Value As Color)
mBackColor = Value
End Set
End Property
Public Property Locked() As Boolean
Get
Return Not mctrl Is Nothing
End Get
Set(ByVal Value As Boolean)
If Value = False Then
mctrl = Nothing
Else
mctrl = New DblBufferPanel
End If
End Set
End Property
Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush, ByVal alignToRight As Boolean)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Static bPainted As Boolean = False
If Not bPainted And Not (mctrl Is Nothing) Then
dg = Me.DataGridTableStyle.DataGrid
dg.Parent.Controls.Add(mctrl)
MovePanel()
mctrl.BringToFront()
pt = dg.GetCellBounds(0, 0).Location
If TypeOf dg.DataSource Is DataTable Then
AddHandler DirectCast(dg.DataSource, DataTable).DefaultView.ListChanged, AddressOf dv_ListChanged
ElseIf TypeOf dg.DataSource Is DataView Then
AddHandler DirectCast(dg.DataSource, DataView).ListChanged, AddressOf dv_ListChanged
End If
End If
cm = source
ar = alignToRight
bPainted = True
If Me.DataGridTableStyle.DataGrid.IsSelected(rowNum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F, 0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F, 1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If Not bPanelOnly Then
MyBase.Paint(g, bounds, source, rowNum, brBack, brFore, alignToRight)
End If
If Not (mctrl Is Nothing) Then
' if there is another control to draw on move the bounds to the right edge if htere is not then it will ignore that directive right? yesgot oitf the control
'mctrl.BackgroundImage = bm
PaintRow(mctrl.CreateGraphics, bounds, rowNum)
End If
If Me.GetColumnValueAtRow(source, rowNum).ToString = "Davolio" Then
Me.DataGridTableStyle.DataGrid.Select(rowNum)
End If
End Sub
Public Shadows Sub BeginUpdate()
MyBase.BeginUpdate()
End Sub
Public Shadows Sub EndUpdate()
MyBase.EndUpdate()
End Sub
Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
MyBase.Edit(source, rowNum, bounds, [readOnly], instantText, cellIsVisible)
MyBase.TextBox.ForeColor = ForeColor()
MyBase.TextBox.BackColor = BackColor
End Sub
Public Sub New()
End Sub
Private Sub dg_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Scroll
Trace.WriteLine("Scroll")
RedrawPanel()
End Sub
Private Sub MovePanel()
mctrl.Location = New Point(dg.Left + dg.RowHeaderWidth + 2, dg.Top + 21)
Dim intFactor As Integer = SystemInformation.HorizontalScrollBarHeight
For Each ctrl As Control In Me.DataGridTableStyle.DataGrid.Controls
If TypeOf ctrl Is HScrollBar Then
If Not DirectCast(ctrl, HScrollBar).Visible Then intFactor = 0
End If
Next
mctrl.Height = dg.Height - 21 - intFactor - 2
End Sub
Private Sub dg_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Move
MovePanel()
End Sub
Private Sub PreparePanel()
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = mctrl.CreateGraphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Catch
End Try
End Sub
Private Sub dv_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs)
'PreparePanel()
RedrawPanel()
End Sub
Private Sub dg_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.VisibleChanged
Try
mctrl.Visible = dg.Visible
Catch ex As Exception
End Try
End Sub
Private Sub dg_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.SizeChanged
MovePanel()
RedrawPanel()
End Sub
Private Sub RedrawPanel()
Static oldTop As Integer = 0
If Not mctrl Is Nothing And dg.VisibleRowCount > 0 Then
Application.DoEvents()
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row, dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
bPanelOnly = False
End If
End Sub
Private Sub dg_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles dg.Resize
MovePanel()
End Sub
Private Sub mctrl_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles mctrl.Paint
Dim sf As New StringFormat
sf.LineAlignment = StringAlignment.Center
Dim rDraw As New RectangleF(0, 0, Me.Width, 20)
Dim g As Graphics = e.Graphics
g.Clear(mctrl.BackColor)
Try
g.DrawString(Me.HeaderText, dg.Font, Brushes.Black, rDraw, sf)
ControlPaint.DrawBorder3D(g, _
New Rectangle(0, 0, Me.Width, 19), Border3DStyle.RaisedInner)
Debug.WriteLine("Panel Paint")
Dim hti As DataGrid.HitTestInfo = dg.HitTest(pt)
Dim newRow As Integer = hti.Row
Dim oldTop As Integer
Trace.WriteLine(String.Format("First Row {0} Visible rows {1}", hti.Row, dg.VisibleRowCount))
oldTop = newRow
bPanelOnly = True
For x As Integer = oldTop To oldTop + dg.VisibleRowCount - 1
If x < cm.Count Then
Trace.WriteLine(String.Format("Drawing Row {0} {1}", x, dg.GetCellBounds(x, dg.FirstVisibleColumn)))
Paint(Nothing, dg.GetCellBounds(x, dg.FirstVisibleColumn), _
cm, x, Nothing, Nothing, ar)
End If
Next
Catch
End Try
End Sub
Private Sub PaintRow(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal rownum As Integer)
Dim brFore As Brush
Dim brBack As Brush
Dim cFore As Color
Dim cBack As Color
Dim bounds2 As New Rectangle(0, bounds.Y - 21, bounds.Width, bounds.Height)
If Me.DataGridTableStyle.DataGrid.IsSelected(rownum) Then
cFore = Me.DataGridTableStyle.SelectionForeColor
cBack = Me.DataGridTableStyle.SelectionBackColor
Else
cFore = ForeColor
cBack = BackColor
End If
brBack = New LinearGradientBrush(bounds, cBack, Color.White, 90, False)
brFore = New SolidBrush(cFore) Dim bl As New Blend
bl.Factors = New Single() {0.0F, 0.1F, 0.5F, 0.7F, 0.7F, 0.5F, 0.3F, 0.2F, 0}
bl.Positions = New Single() {0, 0.1F, 0.2F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F, 1.0F}
DirectCast(brBack, LinearGradientBrush).Blend = bl
If mctrl.Width <> Me.Width Then mctrl.Width = Me.Width
MyBase.Paint(g, bounds2, cm, rownum, _
brBack, brFore, ar)
If rownum = cm.Count - 1 Then
Dim br As New SolidBrush(Me.DataGridTableStyle.DataGrid.Backgrou ndColor)
g.FillRectangle(br, 0, bounds2.Bottom + 1, mctrl.Width, _
mctrl.Height - bounds2.Bottom - 1)
End If
End Sub
End Class Ken
-------------------------------
"Agnes" <ag***@dynamictech.com.hk> wrote in message news:uC**************@TK2MSFTNGP10.phx.gbl... I understand it is impossible, but still curious to know "Can I freeze several column in the datagrid, the user can only scroll the first 3 columns (not verical), for the rest of the coulumn, it is freeze.
This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: gcmf8888 |
last post by:
How to freeze column in datagrid like Excel? Thanks.
|
by: Ben |
last post by:
Is there any way to freeze the DataGrid headers so that
the headers are always viewable while srolling down?
Thanks in advance,
Ben!
|
by: Ben |
last post by:
Has anyone achieve freezing column(s) in a datagrid or datalist, without the use of 3rd party component
Thanks
Ben
|
by: Eusebio |
last post by:
Hi
How to freeze the first datagrid column?, I don't want it hide when the
grid is right scrolling
|
by: Roger Withnell |
last post by:
I would like to freeze column and row headings on a webpage, simulating
freeze panes as in an Excel spreadsheet.
Don't seem to be able to do it with Frames. Is there a way with Javascript...
|
by: seanlin816 |
last post by:
Hi,
I am developing a windows form application using datagrid control. The request is that users need the column header to stay in the grid and only scroll down the data. I have no idea where to...
|
by: kdpo1990 |
last post by:
I've worked with ASP.NET apps. for a long time, but now, i have to
figure out
how to do same in win app. I need to find a way to lock or freeze table
column in datagrid.
This is a link to an...
|
by: Localbar |
last post by:
Anyone have idea how to do that?
Thanks a lot
Localbar
|
by: rajkumarWaits |
last post by:
I have a requirement of freezing the first column of the datagrid. I was able to achieve it via CSS. Problem is, I have a dropdown in the grid which comes above the frozen column. Since dropdown is a...
|
by: CloudSolutions |
last post by:
Introduction:
For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
|
by: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
| |