About Me

My photo
Northglenn, Colorado, United States
I'm primarily a BI Developer on the Microsoft stack. I do sometimes touch upon other Microsoft stacks ( web development, application development, and sql server development).

Monday, March 12, 2007

VB.Net: Freeze a column in a data grid.

Ok, there is additional code that can be added to make this and feel more effiecient, but this gets the job done.

In your customize datagrid control override the horizontal scrollbar events with a class like this:

Protected Overrides Sub GridHScrolled(ByVal sender As Object, ByVal se As System.Windows.Forms.ScrollEventArgs)

Select Case se.Type

Case ScrollEventType.SmallIncrement, ScrollEventType.LargeIncrement
Dim SumWidth = 0
For i As Integer = _ColumnNumber + 1 To MyBase.TableStyles(0).GridColumnStyles.Count - 1
If MyBase.TableStyles(0).GridColumnStyles(i).Width > 0 Then
MyBase.TableStyles(0).GridColumnStyles(i).Width = 0
Exit For
End If
SumWidth += MyBase.TableStyles(0).GridColumnStyles(i).Width
MyBase.TableStyles(0).GridColumnStyles(MyBase.TableStyles(0).GridColumnStyles.Count - 1).Width() += MyBase.TableStyles(0).DataGrid().Width - SumWidth

Case ScrollEventType.SmallDecrement, ScrollEventType.LargeDecrement
For i As Integer = MyBase.TableStyles(0).GridColumnStyles.Count - 1 To 1 Step -1
If MyBase.TableStyles(0).GridColumnStyles(i).Width = 0 Then
MyBase.TableStyles(0).GridColumnStyles(i).Width = 100
Exit For
End If

Case ScrollEventType.EndScroll, ScrollEventType.First, ScrollEventType.Last, ScrollEventType.ThumbPosition, ScrollEventType.ThumbTrack
MyBase.GridHScrolled(sender, se)
End Select
.GridHScrolled(sender, se)
End If
End Sub


H said...

I wanted to implement the code for freezing columns in a datagrid. It doesn't work. It compiles but doesn't do anything.
What is the variable _ColumnNumber used for. If I assign '0', the code compiles and theerr are no runtime errors but doesn't freeze the column though. If I use any other value, I get 'index out of range exception'

William Andrus said...

The _ColumnNumber is a variable:

Private _ColumnNumber As Integer = 0

Which I use to set what column I want to use to freeze by using a property:

Public Property FirstColumn() As Integer
Return _ColumnNumber
End Get
Set(ByVal Value As Integer)
_ColumnNumber = Value
End Set
End Property

In my situation, I didn't always want to freeze the very first column since sometimes I have dummy columns. Hope that helps, sorry for the delay.

Vivek Gadgil said...

Hi Andrus,

This is Viv. I also have a requirement where I want to frezze first 3-4 columns of the GRID. I am using VS 2003 and VB.net. I read your code and comment but frankly I am not sure on how to implement this. If you could send me your custom GRID code or some hints on using the code, I will really appreciate it. Thanks.