以文本方式查看主题 - 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类可以解决这个问题,将合计行一直显示在底部。 详细请参照代码 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类中分别有上下左右冻结的四个方法 |