以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [分享]C1FlexGrid合计行底部冻结解决方法  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=43912)

--  作者:jnletao
--  发布时间:2013/12/18 17:37:00
--  [分享]C1FlexGrid合计行底部冻结解决方法
今天无意间浏览网页看这个帖子,不知有没有大神可以将其转化为全局代码供table使用
这是原帖http://blog.csdn.net/tyouvivi/article/details/1676267
-------------------------------------------------------------------------------------

在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(255255192)
        
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 - 10= "合计"
    
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行。