今天无意间浏览网页看这个帖子,不知有没有大神可以将其转化为全局代码供table使用
在C1FlexGrid使用过程中经常用到合计行,但是C1FlexGrid的属性中却没有最下端行或者最右端列的冻结,利用FlexFreeze类可以解决这个问题,将合计行一直显示在底部。
详细请参照代码
FrozenBottom类
Imports System.Text
Imports C1.Win.C1FlexGrid
Imports System.Drawing
Public Class FrozenBottom
Private dt As DataTable = Nothing ''全部DataTable
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
dt = GetData()
Me.C1FlexGrid1.DataSource = dt
Me.C1FlexGrid1.AllowResizing = C1.Win.C1FlexGrid.AllowResizingEnum.None
C1FlexGrid1.Rows(0).Height = 30 ''
C1FlexGrid1.Rows(C1FlexGrid1.Rows.Count - 1).AllowEditing = False
C1FlexGrid1.Select(-1, -1)
''背景色
For i As Int32 = 1 To C1FlexGrid1.Rows.Count - 2
C1FlexGrid1.Rows(i).StyleNew.BackColor = Color.FromArgb(255, 255, 192)
Next
''单元格背景色
Dim sLightBlue As CellStyle = C1FlexGrid1.Styles.Add("LightBlue")
sLightBlue.BackColor = Drawing.Color.LightBlue
Dim sLightPink As CellStyle = C1FlexGrid1.Styles.Add("LightPink")
sLightPink.BackColor = Drawing.Color.LightPink
For i As Int32 = 1 To C1FlexGrid1.Rows.Count - 2
If i Mod 2 = 1 Then
C1FlexGrid1.SetCellStyle(i, 2, sLightBlue)
Else
C1FlexGrid1.SetCellStyle(i, 4, sLightPink)
End If
''行号
C1FlexGrid1(i, 0) = i.ToString
Next
''列宽
For i As Int32 = 1 To C1FlexGrid1.Cols.Count - 1
C1FlexGrid1.Cols(i).Width = 100
Next
''列冻结
C1FlexGrid1.Cols.Frozen = 1
''最下端一行冻结
Dim ffb As FlexFreeze.FlexFreezeBottom = New FlexFreeze.FlexFreezeBottom(Me.C1FlexGrid1, 1)
''最右列冻结()
'Dim ffc As FlexFreeze.FlexFreezeRight = New FlexFreeze.FlexFreezeRight(Me.C1FlexGrid1, 1)
''最下端冻结行颜色
C1FlexGrid1.Rows(C1FlexGrid1.Rows.Count - 1).StyleNew.BackColor = Color.Red
''冻结行Header
C1FlexGrid1(C1FlexGrid1.Rows.Count - 1, 0) = "合计"
End Sub
取得数据
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Close()
End Sub
End Class FlexFreeze类(参照以前项目,注释未修改)
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports C1.Win.C1FlexGrid
Public Class FlexFreeze
#Region "クラス変数"
Shared BACKCOLOR As Brush = Brushes.Beige
#End Region
#Region " FlexFreezeTop "
' Panelクラスを継承し、FlexGridを使用したクラスです。
' パネルに含まれるグリッド(子グリッド)は、固定行が見えないように位置されます。
' また、最下部「n」列が見えるように、子グリッドもサイズ調整され、スクロールされます。
'
' 子グリッドは、親FlexGridに結び付けられます。
' したがって、根本的なグリッドモデル(データ、レイアウト、スタイル、選択など)を共有します。
'
' 全体のコントロール(パネルおよびパネル内のグリッド)は
' 親のFlexGridに関連付けられ、その最上部に位置します。
'
' このように、そのコントロールは、常に親グリッドの最上部「n」列を示します。
Public Class FlexFreezeTop
Inherits Panel
#Region " Fields "
Dim WithEvents _frz As C1.Win.C1FlexGrid.C1FlexGrid
Dim WithEvents _main As C1.Win.C1FlexGrid.C1FlexGrid
Dim _rows As Int32
#End Region
#Region " Constructors "
Public Sub New(ByVal main As C1.Win.C1FlexGrid.C1FlexGrid, ByVal rows As Int32)
MyBase.New()
_main = main
_rows = rows
' 最上部に静止行を持つ、子グリッドを生成します。
_frz = New C1.Win.C1FlexGrid.C1FlexGrid
_frz.ScrollBars = ScrollBars.None
_frz.BorderStyle = C1.Win.C1FlexGrid.Util.BaseControls.BorderStyleEnum.None
_frz.DrawMode = DrawModeEnum.OwnerDraw
_frz.KeyActionEnter = KeyActionEnum.None
Controls.Add(_frz)
' 子グリッドと親グリッドを接続します。(データやレイアウト、選択状態を共有)
_frz.DataSource = main
' 親グリッドに追加します。
main.Controls.Add(Me)
' 初期化
AdjustLayout()
End Sub
#End Region
#Region " Friend Methods "
Friend Sub AdjustLayout()
' 最上部に表示する静止行のインデックスを取得します。
Dim rows As RowCollection = _main.Rows
Dim r2 As Int32 = rows.Count - 1
Dim r1 As Int32 = rows.Fixed + _rows - 1
If r2 <= r1 Then Return
' コントロールのサイズや位置を設定します。
Dim rc As Rectangle = _main.ClientRectangle
Dim hei As Int32 = rows(r1).Bottom - rows(rows.Fixed).Top
rc.Y = rows(rows.Fixed).Top
rc.Height = hei
Bounds = rc
' 固定行を隠すために、子グリッドを調節します。
rc = ClientRectangle
hei = rows(rows.Fixed + rows.Frozen).Top
rc.Y -= hei
rc.Height += hei
_frz.Bounds = rc
' スクロール位置を同期させます。
SynchScrollPosition(False)
End Sub
Friend Sub SynchScrollPosition(ByVal synchMain As Boolean)
Dim pos As Point
' 親グリッド上のXスクロール位置を同期させます。
If synchMain Then
pos = _frz.ScrollPosition
pos.Y = _main.ScrollPosition.Y
_main.ScrollPosition = pos
End If
' 親グリッドの静止行の位置をXスクロール位置をに同期させます。
pos = _main.ScrollPosition
pos.Y = 0
_frz.ScrollPosition = pos
' すぐにすべてを更新します。
_main.Update()
_frz.Update()
End Sub
#End Region
Events
End Class
#End Region
FlexFreezeBottom
FlexFreezeLeft
FlexFreezeRight
End Class
效果如下:
在FlexFreeze类中分别有上下左右冻结的四个方法
FlexFreeze.FlexFreezeLeft()
FlexFreeze.FlexFreezeRight()
FlexFreeze.FlexFreezeTop()
FlexFreeze.FlexFreezeBottom()
FlexGrid自带的行列冻结分别是上和左,所以基本上用到这个类的也就是下端行冻结或者是右端列冻结
使用方法为
Dim ffb As FlexFreeze.FlexFreezeBottom = New FlexFreeze.FlexFreezeBottom(Me.C1FlexGrid1, 1)
Me.C1FlexGrid1为要冻结的FlexGrid,1 表示冻结1行。