#region Imports
|
|
using DPumpHydr.WinFrmUI.RLT.Controls;
|
using System;
|
using System.ComponentModel;
|
using System.Windows.Forms;
|
|
#endregion
|
|
namespace DPumpHydr.WinFrmUI.RLT.Helper
|
{
|
#region MaterialHelper
|
|
public class PoisonDataGridHelper
|
{
|
private readonly PoisonScrollBar _scrollbar;
|
|
private readonly DataGridView _grid;
|
|
private int _ignoreScrollbarChange = 0;
|
|
private readonly bool _ishorizontal = false;
|
private readonly HScrollBar hScrollbar = null;
|
private readonly VScrollBar vScrollbar = null;
|
|
public PoisonDataGridHelper(PoisonScrollBar scrollbar, DataGridView grid) : this(scrollbar, grid, true)
|
{ }
|
|
public PoisonDataGridHelper(PoisonScrollBar scrollbar, DataGridView grid, bool vertical)
|
{
|
_scrollbar = scrollbar;
|
_scrollbar.UseBarColor = true;
|
_grid = grid;
|
_ishorizontal = !vertical;
|
|
foreach (object item in _grid.Controls)
|
{
|
if (item.GetType() == typeof(VScrollBar))
|
{
|
vScrollbar = (VScrollBar)item;
|
}
|
|
if (item.GetType() == typeof(HScrollBar))
|
{
|
hScrollbar = (HScrollBar)item;
|
}
|
}
|
|
_grid.RowsAdded += new DataGridViewRowsAddedEventHandler(_grid_RowsAdded);
|
_grid.UserDeletedRow += new DataGridViewRowEventHandler(_grid_UserDeletedRow);
|
_grid.Scroll += new ScrollEventHandler(_grid_Scroll);
|
_grid.Resize += new EventHandler(_grid_Resize);
|
_scrollbar.Scroll += _scrollbar_Scroll;
|
_scrollbar.ScrollbarSize = 21;
|
|
UpdateScrollbar();
|
}
|
|
private void _grid_Scroll(object sender, ScrollEventArgs e)
|
{
|
UpdateScrollbar();
|
}
|
|
private void _grid_UserDeletedRow(object sender, DataGridViewRowEventArgs e)
|
{
|
UpdateScrollbar();
|
}
|
|
private void _grid_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
|
{
|
UpdateScrollbar();
|
}
|
|
private void _scrollbar_Scroll(object sender, ScrollEventArgs e)
|
{
|
if (_ignoreScrollbarChange > 0)
|
{
|
return;
|
}
|
|
if (_ishorizontal)
|
{
|
try
|
{
|
hScrollbar.Value = _scrollbar.Value;
|
_grid.HorizontalScrollingOffset = _scrollbar.Value;
|
}
|
catch { }
|
}
|
else
|
{
|
|
try
|
{
|
int firstDisplayedRowIndex = 0;
|
|
if (_scrollbar.Value >= 0 && _scrollbar.Value < _grid.Rows.Count)
|
{
|
firstDisplayedRowIndex = _scrollbar.Value + (_scrollbar.Value == 1 ? -1 : 1) >= _grid.Rows.Count ? _grid.Rows.Count - 1 : _scrollbar.Value + (_scrollbar.Value == 1 ? -1 : 1);
|
}
|
else
|
{
|
firstDisplayedRowIndex = _scrollbar.Value - 1;
|
}
|
|
while (!_grid.Rows[firstDisplayedRowIndex].Visible)
|
{
|
if (firstDisplayedRowIndex < 1)
|
{
|
firstDisplayedRowIndex = 0;
|
}
|
else
|
{
|
firstDisplayedRowIndex -= 1;
|
}
|
}
|
|
_grid.FirstDisplayedScrollingRowIndex = firstDisplayedRowIndex;
|
}
|
catch (Exception)
|
{
|
_grid.FirstDisplayedScrollingRowIndex = 0;
|
}
|
|
}
|
|
_grid.Invalidate();
|
}
|
|
private void BeginIgnoreScrollbarChangeEvents()
|
{
|
_ignoreScrollbarChange++;
|
}
|
|
private void EndIgnoreScrollbarChangeEvents()
|
{
|
if (_ignoreScrollbarChange > 0)
|
{
|
_ignoreScrollbarChange--;
|
}
|
}
|
|
public void UpdateScrollbar()
|
{
|
if (_grid == null)
|
{
|
return;
|
}
|
|
try
|
{
|
BeginIgnoreScrollbarChangeEvents();
|
|
if (_ishorizontal)
|
{
|
//int visibleCols = VisibleFlexGridCols();
|
_scrollbar.Maximum = hScrollbar.Maximum;
|
_scrollbar.Minimum = hScrollbar.Minimum;
|
_scrollbar.SmallChange = hScrollbar.SmallChange;
|
_scrollbar.LargeChange = hScrollbar.LargeChange;
|
_scrollbar.Location = new(0, _grid.Height - _scrollbar.ScrollbarSize);
|
_scrollbar.Width = _grid.Width - (vScrollbar.Visible ? _scrollbar.ScrollbarSize : 0);
|
_scrollbar.BringToFront();
|
_scrollbar.Visible = hScrollbar.Visible;
|
_scrollbar.Value = hScrollbar.Value == 0 ? 1 : hScrollbar.Value;
|
}
|
else
|
{
|
int visibleRows = VisibleFlexGridRows();
|
_scrollbar.Maximum = _grid.RowCount;
|
_scrollbar.Minimum = 1;
|
_scrollbar.SmallChange = 1;
|
_scrollbar.LargeChange = Math.Max(1, visibleRows - 1);
|
_scrollbar.Value = _grid.FirstDisplayedScrollingRowIndex;
|
if (_grid.RowCount > 0 && _grid.Rows[_grid.RowCount - 1].Cells[0].Displayed)
|
{
|
_scrollbar.Value = _grid.RowCount;
|
}
|
|
_scrollbar.Location = new(_grid.Width - _scrollbar.ScrollbarSize, 0);
|
_scrollbar.Height = _grid.Height - (hScrollbar.Visible ? _scrollbar.ScrollbarSize : 0);
|
_scrollbar.BringToFront();
|
_scrollbar.Visible = vScrollbar.Visible;
|
}
|
}
|
finally
|
{
|
EndIgnoreScrollbarChangeEvents();
|
}
|
}
|
|
private int VisibleFlexGridRows()
|
{
|
return _grid.DisplayedRowCount(true);
|
}
|
|
private int VisibleFlexGridCols()
|
{
|
return _grid.DisplayedColumnCount(true);
|
}
|
|
public bool VisibleVerticalScroll()
|
{
|
bool _return = false;
|
|
if (_grid.DisplayedRowCount(true) < _grid.RowCount + (_grid.RowHeadersVisible ? 1 : 0))
|
{
|
_return = true;
|
}
|
|
return _return;
|
}
|
|
public bool VisibleHorizontalScroll()
|
{
|
bool _return = false;
|
|
if (_grid.DisplayedColumnCount(true) < _grid.ColumnCount + (_grid.ColumnHeadersVisible ? 1 : 0))
|
{
|
_return = true;
|
}
|
|
return _return;
|
}
|
|
#region Events of interest
|
|
private void _grid_Resize(object sender, EventArgs e)
|
{
|
UpdateScrollbar();
|
}
|
|
private void _grid_AfterDataRefresh(object sender, ListChangedEventArgs e)
|
{
|
UpdateScrollbar();
|
}
|
#endregion
|
}
|
|
#endregion
|
}
|