Helper class to support percentage sizing in GridControl/GridDataBoundGrid
The sample below has a helper class which, supports the automatic sizing in both a GridControl or GridDataBoundGrid in two ways. One way, which, is referred to as proportional sizing, is where all columns in the grid are equally sized. The other technique which, is referred to as percentage sizing, will allow you to specifiy that certain columns should occupy certain percentages of the available space for these columns.
For an example of percentage sizing, assume that you have 5 columns in a grid. You can specify that column 5 must occupy 40% of the available space, and columns 1 and 2 must occupy 25% each of the available space. In this case, the helper class will take sum of the widths of the columns 1, 2, and 5. Widths are calculated based on percentage mentioned with the modified clientwidth. ie. Column 0 is kept undisturbed. It will then subtract this sum from the clientwidth. This will give the total space that is available for columns 3 and 4 which, would be 5% for each. In this manner, the columns will exactly occupy the client width of the grid.
WireGrid and UnwireGrid are methods that are used to enable the sizing helper class. Proportional sizing is achieved using the QueryColWidth event. Percentage sizing will explicilty set the ColWidth[index] property for each column.
C#
public class GridColSizingHelper
{
private GridControlBase grid;
public GridColSizingHelper(){}
public bool WireGrid(GridControlBase grid, Hashtable ht)
{
int temp = 0;
this.colPWidths = ht;
for(int i = 1; i <= grid.Model.ColCount; ++i)
{
if(colPWidths.ContainsKey(i))
temp += int.Parse(colPWidths[i].ToString());
}
// temp > 100 - unmodified column count
if( temp > 100-(grid.Model.ColCount - colPWidths.Count))
return false;
if(this.grid != null)
UnwireGrid();
this.grid = grid;
TurnOffProportion();
this.grid.ResizingColumns += new GridResizingColumnsEventHandler(grid_ResizingColumns);
this.TurnOnPercentages();
return true;
}
bool WireGridFlag;
public void WireGrid(GridControlBase grid)
{
if(this.grid != null)
UnwireGrid();
this.grid = grid;
grid.Model.Options.SmoothControlResize = false;
this.grid.Model.QueryColWidth += new GridRowColSizeEventHandler(Model_QueryColWidth);
this.grid.ResizingColumns += new GridResizingColumnsEventHandler(grid_ResizingColumns);
grid.Refresh();
WireGridFlag = true;
return;
}
public void UnwireGrid()
{
if(this.grid != null)
{
this.grid.ResizingColumns -= new GridResizingColumnsEventHandler(grid_ResizingColumns);
this.grid.Model.QueryColWidth -= new GridRowColSizeEventHandler(Model_QueryColWidth);
this.grid.Refresh();
this.reset();
this.grid = null;
}
}
int clientsize, remainingSize;
private void Model_QueryColWidth(object sender, GridRowColSizeEventArgs e)
{
if(e.Index > grid.Model.Cols.HeaderCount)
{
//clientsize = ClientSize - Row Headers
this.clientsize = grid.ClientSize.Width - grid.Model.ColWidths.GetTotal(0, this.grid.Model.Cols.HeaderCount);
e.Size = (int)clientsize / grid.Model.ColCount;
e.Handled = true;
}
}
public void TurnOffProportion()
{
if(WireGridFlag)
{
this.grid.Model.QueryColWidth -= new GridRowColSizeEventHandler(Model_QueryColWidth);
WireGridFlag = false;
}
}
}
public void TurnOnPercentages()
{
try
{
int totalPercentSize = 0;
this.clientsize = grid.ClientSize.Width - grid.Model.ColWidths.GetTotal(0, this.grid.Model.Cols.HeaderCount);
for(int i = 1; i <= grid.Model.ColCount; ++i)
{
if(colPWidths.ContainsKey(i))
totalPercentSize += (int)clientsize * int.Parse(colPWidths[i].ToString())/100;
}
remainingSize =(int)(clientsize - totalPercentSize)/(grid.Model.ColCount - colPWidths.Count);
// Setting the column widths from Hashtable passed through WireGrid
for(int i = 1; i <= grid.Model.ColCount; ++i)
{
if(colPWidths.ContainsKey(i))
grid.Model.ColWidths[i] = (int)clientsize * int.Parse(colPWidths[i].ToString())/100;
else
grid.Model.ColWidths[i] = remainingSize;
}
}
catch
{
MessageBox.Show("Make sure the Grid is wired before calling TurnOnPercentages()");
}
}
}
private GridColSizingHelper Helper1;
private GridColSizingHelper Helper2;
private void Form1_Load(object sender, System.EventArgs e)
{
// There is a condition check in accepting hashtable values
// ie.. the total of values passed must not be greater than (100 - Unmodified Column count)
ht = new Hashtable();
ht.Add(1,20);
ht.Add(9,30);
ht.Add(4,13);
// Attempts like using unwanted keys are not encouraged because count is being used
//ht.Add(12,100);
Helper1 = new GridColSizingHelper();
Helper2 = new GridColSizingHelper();
Helper2.WireGrid(this.gridControl1,ht);
this.gridDataBoundGrid1.AllowResizeToFit = false;
Helper1.WireGrid(this.gridDataBoundGrid1,ht);
}
VB
Public Class GridColSizingHelper
Private grid As GridControlBase
Public Sub New()
End Sub
Public Function WireGrid(ByVal grid As GridControlBase, ByVal ht As Hashtable) As Boolean
Dim temp As Integer = 0
Me.colPWidths = ht
For i As Integer = 1 To grid.Model.ColCount
If colPWidths.ContainsKey(i) Then
temp += Integer.Parse(colPWidths(i).ToString())
End If
Next i
' temp > 100 - unmodified column count
If temp > 100-(grid.Model.ColCount - colPWidths.Count) Then
Return False
End If
If Not Me.grid Is Nothing Then
UnwireGrid()
End If
Me.grid = grid
TurnOffProportion()
AddHandler grid.ResizingColumns, AddressOf grid_ResizingColumns
Me.TurnOnPercentages()
Return True
End Function
Private WireGridFlag As Boolean
Public Sub WireGrid(ByVal grid As GridControlBase)
If Not Me.grid Is Nothing Then
UnwireGrid()
End If
Me.grid = grid
grid.Model.Options.SmoothControlResize = False
AddHandler grid.Model.QueryColWidth, AddressOf Model_QueryColWidth
AddHandler grid.ResizingColumns, AddressOf grid_ResizingColumns
grid.Refresh()
WireGridFlag = True
Return
End Sub
Public Sub UnwireGrid()
If Not Me.grid Is Nothing Then
RemoveHandler grid.ResizingColumns, AddressOf grid_ResizingColumns
RemoveHandler grid.Model.QueryColWidth, AddressOf Model_QueryColWidth
Me.grid.Refresh()
Me.reset()
Me.grid = Nothing
End If
End Sub
Private clientsize, remainingSize As Integer
Private Sub Model_QueryColWidth(ByVal sender As Object, ByVal e As GridRowColSizeEventArgs)
If e.Index > grid.Model.Cols.HeaderCount Then
'clientsize = ClientSize - Row Headers
Me.clientsize = grid.ClientSize.Width - grid.Model.ColWidths.GetTotal(0, Me.grid.Model.Cols.HeaderCount)
e.Size = CInt(Fix(clientsize)) / grid.Model.ColCount
e.Handled = True
End If
End Sub
Public Sub TurnOffProportion()
If WireGridFlag Then
RemoveHandler grid.Model.QueryColWidth, AddressOf Model_QueryColWidth
WireGridFlag = False
End If
End Sub
Public Sub TurnOnPercentages()
Try
Dim totalPercentSize As Integer = 0
Me.clientsize = grid.ClientSize.Width - grid.Model.ColWidths.GetTotal(0, Me.grid.Model.Cols.HeaderCount)
For i As Integer = 1 To grid.Model.ColCount
If colPWidths.ContainsKey(i) Then
totalPercentSize += CInt(Fix(clientsize)) * Integer.Parse(colPWidths(i).ToString())/100
End If
Next i
remainingSize =CInt(Fix(clientsize - totalPercentSize))/(grid.Model.ColCount - colPWidths.Count)
' Setting the column widths from Hashtable passed through WireGrid
For i As Integer = 1 To grid.Model.ColCount
If colPWidths.ContainsKey(i) Then
grid.Model.ColWidths(i) = CInt(Fix(clientsize)) * Integer.Parse(colPWidths(i).ToString())/100
Else
grid.Model.ColWidths(i) = remainingSize
End If
Next i
Catch
MessageBox.Show("Make sure the Grid is wired before calling TurnOnPercentages()")
End Try
End Sub
End Class
Private Helper1 As GridColSizingHelper
Private Helper2 As GridColSizingHelper
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
' There is a condition check in accepting hashtable values
' ie.. the total of values passed must not be greater than (100 - Unmodified Column count)
ht = New Hashtable()
ht.Add(1,20)
ht.Add(9,30)
ht.Add(4,13)
' Attempts like using unwanted keys are not encouraged because count is being used
'ht.Add(12,100);
Helper1 = New GridColSizingHelper()
Helper2 = New GridColSizingHelper()
Helper2.WireGrid(Me.gridControl1,ht)
Me.gridDataBoundGrid1.AllowResizeToFit = False
Helper1.WireGrid(Me.gridDataBoundGrid1,ht)
End Sub
Here is a sample that illustrates this: