Foxtable(狐表)用户栏目专家坐堂 → [分享]C1FlexGrid合计行底部冻结解决方法


  共有7032人关注过本帖树形打印复制链接

主题:[分享]C1FlexGrid合计行底部冻结解决方法

帅哥哟,离线,有人找我吗?
jnletao
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:943 积分:7802 威望:0 精华:0 注册:2013/7/7 13:37:00
[分享]C1FlexGrid合计行底部冻结解决方法  发帖心情 Post By:2013/12/18 17:37:00 [显示全部帖子]

今天无意间浏览网页看这个帖子,不知有没有大神可以将其转化为全局代码供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行。


 回到顶部