// 冻结列
c1FlexGrid1.Cols.Frozen = 3;
// 冻结行
c1FlexGrid1.Rows.Frozen = -1;
冻结最后一行,和最右边列.的方法,已经找到,研究一下,成功了再贴上来!Oh Yeah!...
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using C1.Win.C1FlexGrid; namespace FlexFreezeBottomSample { /// <summary> /// /// FlexFreezeBottom /// /// This is a control (derived from Panel) that contains a FlexGrid. The /// contained FlexGrid is positioned with a negative Y coordinate within /// the panel so that the fixed rows are not visible. /// /// The contained grid is also sized and scrolled via code so that the /// bottom 'n' rows are visible. /// /// The contained grid is bound to a main FlexGrid and therefore shares /// the underlying grid model (data, layout, styles, selection, etc). /// /// The whole control (panel and contained grid) is attached to the main /// FlexGrid and positioned at its bottom. This way, the control always /// shows the bottom 'n' rows of the main grid. /// /// </summary> internal class FlexFreezeBottom : Panel { private C1.Win.C1FlexGrid.C1FlexGrid _frz; private C1.Win.C1FlexGrid.C1FlexGrid _main; private int _rows; internal FlexFreezeBottom(C1.Win.C1FlexGrid.C1FlexGrid main, int rows) { // save info we'll need later _main = main; _rows = rows; // create child grid with frozen bottom 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.OwnerDrawCell += new C1.Win.C1FlexGrid.OwnerDrawCellEventHandler(_frz_OwnerDrawCell); _frz.SetupEditor += new C1.Win.C1FlexGrid.RowColEventHandler(_frz_SetupEditor); _frz.AfterScroll += new C1.Win.C1FlexGrid.RangeEventHandler(_frz_AfterScroll); _frz.GridChanged += new C1.Win.C1FlexGrid.GridChangedEventHandler(_main_GridChanged); Controls.Add(_frz); // bind frozen grid to main grid (share data, layout, styles, selection) _frz.DataSource = main; // add this to the main grid main.Controls.Add(this); // hook up the events we need to synchronize with the main grid main.Resize += new System.EventHandler(_main_Resize); main.AfterScroll += new C1.Win.C1FlexGrid.RangeEventHandler(_main_AfterScroll); main.SelChange += new System.EventHandler(_main_SelChange); main.GridChanged += new C1.Win.C1FlexGrid.GridChangedEventHandler(_main_GridChanged); // initialize AdjustLayout(); } internal void AdjustLayout() { // get index of the bottom (frozen) rows RowCollection rows = _main.Rows; int r2 = rows.Count-1; int r1 = r2 - _rows + 1; if (r1 <= rows.Fixed) r1 = rows.Fixed; // hide control if the main grid is big enough Visible = (r1 <= r2); if (!Visible) return; // set control size and location Rectangle rc = _main.ClientRectangle; if (rows[r2].Bottom <= rc.Bottom) { Visible = false; return; } int hei = rows[r2].Bottom - rows[r1].Top + 1; rc.Y = rc.Bottom - hei; rc.Height = hei; Bounds = rc; // adjust child grid to hide fixed rows rc = ClientRectangle; hei = rows[rows.Fixed + rows.Frozen].Top; rc.Y -= hei; rc.Height += hei; _frz.Bounds = rc; // syncronize scroll position SynchScrollPosition(false); } internal void SynchScrollPosition(bool synchMain) { Point pos; // optionally synchronize X scroll position on the main grid if (synchMain) { pos = _frz.ScrollPosition; pos.Y = _main.ScrollPosition.Y; _main.ScrollPosition = pos; } // syncronize X scroll position of the frozen grid with main pos = _main.ScrollPosition; pos.Y = -64000; _frz.ScrollPosition = pos; // update everything right away _main.Update(); _frz.Update(); } // make normal and scrollable areas look different // (when painting and when editing) private void _frz_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) { if (e.Style.BackColor == _frz.Styles.Normal.BackColor) { e.Graphics.FillRectangle(Brushes.Beige, e.Bounds); e.DrawCell(DrawCellFlags.Border | DrawCellFlags.Content); } } private void _frz_SetupEditor(object sender, C1.Win.C1FlexGrid.RowColEventArgs e) { _frz.BackColor = Color.Beige; } // adjust layout after resizing the main grid (our container) private void _main_Resize(object sender, System.EventArgs e) { AdjustLayout(); } // synchronize scrolling private void _main_AfterScroll(object sender, C1.Win.C1FlexGrid.RangeEventArgs e) { SynchScrollPosition(false); } private void _frz_AfterScroll(object sender, C1.Win.C1FlexGrid.RangeEventArgs e) { // if the frozen grid has the focus and the user selects non-frozen // cells, scroll main grid up. if (_frz.Focused) { int row = Math.Min(_frz.Row, _frz.RowSel); int bot = _main.Rows[row].Bottom + _main.ScrollPosition.Y; if (bot > Top) { // unless this is a mouse selection, give focus to main grid if (!_frz.Capture) _main.Focus(); _main.TopRow = _main.Row; } } SynchScrollPosition(true); } // scroll while selecting // if the user extends the selection down on the main grid, scroll it down. private void _main_SelChange(object sender, System.EventArgs e) { // only when the main grid has the focus! if (!_main.Focused) return; // calculate selection bottom (accounting for scrolling) int row = Math.Max(_main.Row, _main.RowSel); int bot = _main.Rows[row].Bottom + _main.ScrollPosition.Y; // try scrolling if past the bottom of the frozen area if (bot > Top) _main.TopRow++; } // adjust layout after massive changes (resize rows/cols, sort, etc) private void _main_GridChanged(object sender, C1.Win.C1FlexGrid.GridChangedEventArgs e) { switch (e.GridChangedType) { case GridChangedTypeEnum.GridChanged: case GridChangedTypeEnum.LayoutChanged: AdjustLayout(); break; } } } }
主要是这个类.
然后有相应的 这段代码来 进行 c1flexGrid 底部冻结
_flex.AllowFreezing = AllowFreezingEnum.Both;
// bind main grid to Customers table
Bind("select * from customers");
// create frozen area at the bottom, with 3 rows
FlexFreezeBottom ffb = new FlexFreezeBottom(_flex, 3);