SunnyUI/SunnyUI/Controls/UIDataGridView.cs

1020 lines
35 KiB
C#
Raw Normal View History

2020-05-11 21:11:29 +08:00
/******************************************************************************
* SunnyUI
2023-01-07 18:12:33 +08:00
* CopyRight (C) 2012-2023 ShenYongHua().
2021-02-20 15:45:47 +08:00
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
2020-05-11 21:11:29 +08:00
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UIDataGridView.cs
2020-05-11 21:11:29 +08:00
* :
2022-01-05 21:57:47 +08:00
* : V3.1
2020-05-11 21:11:29 +08:00
* : 2020-01-01
*
* 2020-01-01: V2.2.0
* 2020-04-25: V2.2.4
* 2020-07-15: V2.2.6
2020-07-30 21:21:47 +08:00
* 2020-07-18: V2.2.6
* 2020-08-22: V2.2.7
2020-09-17 21:20:47 +08:00
* 2020-08-28: V2.2.7
* 2021-03-25: V3.0.2
* 2021-04-01: V3.0.2 Enter键代替Tab键跳到下一个单元格
* 2021-04-29: V3.0.3
* 2021-05-22: V3.0.4 RowHeight23
* 2021-06-27: V3.0.4
* 2022-01-21: V3.1.0 SelectedIndex值
* 2022-04-16: V3.1.3
* 2022-04-26: V3.1.8 DataSource绑定ListList为空-1
* 2022-06-10: V3.1.9 DataSource绑定List为空-1
* 2022-06-11: V3.1.9 ShowRect,
* BorderStyle = BorderStyle.FixedSingle;
* 2022-06-11: V3.1.9 ShowGridLine,
* CellBorderStyle = DataGridViewCellBorderStyle.Single;
* 2022-06-11: V3.1.9 RowHeight, SetRowHeight()
* AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
* RowTemplate.Height
* 2022-06-22: V3.2.0 ShowRectShowGridLineRowHeight三个属性
* 2022-07-11: V3.2.1
* 2022-07-11: V3.2.1 线
* 2022-07-28: V3.2.2 ScrollBars为None时仍然显示滚动条的问题
* 2022-07-28: V3.2.2
* 2022-10-14: V3.2.6
* 2023-06-28: V3.3.9 使
* 2023-07-12: V3.4.0
2020-05-11 21:11:29 +08:00
******************************************************************************/
using System;
using System.Collections.Generic;
2020-05-11 21:11:29 +08:00
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace Sunny.UI
{
2022-04-11 13:18:21 +08:00
public class UIDataGridView : DataGridView, IStyleInterface, IZoomScale
2020-05-11 21:11:29 +08:00
{
private readonly UIScrollBar VBar = new UIScrollBar();
private readonly UIHorScrollBarEx HBar = new UIHorScrollBarEx();
2020-05-11 21:11:29 +08:00
public UIDataGridView()
{
BackgroundColor = UIColor.White;
GridColor = UIColor.Blue;
2023-05-25 10:51:41 +08:00
base.Font = UIStyles.Font();
base.DoubleBuffered = true;
2020-05-11 21:11:29 +08:00
VBar.Parent = this;
VBar.Visible = false;
HBar.FillColor = VBar.FillColor = UIColor.LightBlue;
VBar.ForeColor = UIColor.Blue;
VBar.StyleCustomMode = true;
VBar.ValueChanged += VBarValueChanged;
2022-03-21 23:25:57 +08:00
VBar.ShowLeftLine = true;
HBar.Parent = this;
HBar.Visible = false;
HBar.ForeColor = UIColor.Blue;
HBar.StyleCustomMode = true;
HBar.ValueChanged += HBar_ValueChanged;
SetBarPosition();
2020-05-11 21:11:29 +08:00
//支持自定义标题行风格
EnableHeadersVisualStyles = false;
//标题行风格
ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
ColumnHeadersDefaultCellStyle.BackColor = UIColor.Blue;
ColumnHeadersDefaultCellStyle.ForeColor = UIColor.White;
ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
2023-05-25 10:51:41 +08:00
ColumnHeadersDefaultCellStyle.Font = UIStyles.Font();
2020-05-11 21:11:29 +08:00
//行头部颜色
RowHeadersDefaultCellStyle.BackColor = UIColor.LightBlue;
RowHeadersDefaultCellStyle.ForeColor = UIFontColor.Primary;
RowHeadersDefaultCellStyle.SelectionBackColor = UIColor.Blue;
RowHeadersDefaultCellStyle.SelectionForeColor = Color.White;
2023-05-25 10:51:41 +08:00
RowHeadersDefaultCellStyle.Font = UIStyles.Font();
2023-05-25 10:51:41 +08:00
RowsDefaultCellStyle.Font = UIStyles.Font();
DefaultCellStyle.Font = UIStyles.Font();
2020-05-11 21:11:29 +08:00
//标题行行高与OnColumnAdded事件配合
ColumnHeadersHeight = 32;
//设置奇偶数行颜色
StripeEvenColor = UIColor.White;
StripeOddColor = UIColor.LightBlue;
VerticalScrollBar.ValueChanged += VerticalScrollBar_ValueChanged;
HorizontalScrollBar.ValueChanged += HorizontalScrollBar_ValueChanged;
VerticalScrollBar.VisibleChanged += VerticalScrollBar_VisibleChanged;
HorizontalScrollBar.VisibleChanged += HorizontalScrollBar_VisibleChanged;
}
private int scrollBarWidth = 0;
[DefaultValue(0), Category("SunnyUI"), Description("垂直滚动条宽度,最小为原生滚动条宽度")]
public int ScrollBarWidth
{
get => scrollBarWidth;
set
{
scrollBarWidth = value;
SetScrollInfo();
}
}
private int scrollBarHandleWidth = 6;
[DefaultValue(6), Category("SunnyUI"), Description("垂直滚动条滑块宽度,最小为原生滚动条宽度")]
public int ScrollBarHandleWidth
{
get => scrollBarHandleWidth;
set
{
scrollBarHandleWidth = value;
if (VBar != null) VBar.FillWidth = value;
}
}
private int scrollBarHeight = 0;
[DefaultValue(0), Category("SunnyUI"), Description("垂直滚动条宽度,最小为原生滚动条宽度")]
public int ScrollBarHeight
{
get => scrollBarHeight;
set
{
scrollBarHeight = value;
SetScrollInfo();
}
}
private int scrollBarHandleHeight = 6;
[DefaultValue(6), Category("SunnyUI"), Description("垂直滚动条滑块宽度,最小为原生滚动条宽度")]
public int ScrollBarHandleHeight
{
get => scrollBarHandleHeight;
set
{
scrollBarHandleHeight = value;
if (HBar != null) HBar.FillHeight = value;
}
}
2022-06-23 23:27:55 +08:00
/// <summary>
/// 禁止控件跟随窗体缩放
/// </summary>
[DefaultValue(false), Category("SunnyUI"), Description("禁止控件跟随窗体缩放")]
2022-04-11 13:18:21 +08:00
public bool ZoomScaleDisabled { get; set; }
2022-06-23 23:27:55 +08:00
/// <summary>
/// 控件缩放前在其容器里的位置
/// </summary>
[Browsable(false), DefaultValue(typeof(Rectangle), "0, 0, 0, 0")]
2022-04-11 13:18:21 +08:00
public Rectangle ZoomScaleRect { get; set; }
2022-06-23 23:27:55 +08:00
/// <summary>
/// 设置控件缩放比例
/// </summary>
/// <param name="scale">缩放比例</param>
2022-04-11 13:18:21 +08:00
public virtual void SetZoomScale(float scale)
{
}
float ColumnHeadersDefaultCellStyleFontSize = -1;
float RowHeadersDefaultCellStyleFontSize = -1;
float DefaultCellStyleFontSize = -1;
float RowsDefaultCellStyleFontSize = -1;
public void SetDPIScale()
{
if (ColumnHeadersDefaultCellStyle.Font != null)
{
if (ColumnHeadersDefaultCellStyleFontSize < 0) ColumnHeadersDefaultCellStyleFontSize = ColumnHeadersDefaultCellStyle.Font.Size;
ColumnHeadersDefaultCellStyle.Font = ColumnHeadersDefaultCellStyle.Font.DPIScaleFont(ColumnHeadersDefaultCellStyleFontSize);
}
if (RowHeadersDefaultCellStyle.Font != null)
{
if (RowHeadersDefaultCellStyleFontSize < 0) RowHeadersDefaultCellStyleFontSize = RowHeadersDefaultCellStyle.Font.Size;
RowHeadersDefaultCellStyle.Font = RowHeadersDefaultCellStyle.Font.DPIScaleFont(RowHeadersDefaultCellStyleFontSize);
}
if (DefaultCellStyle.Font != null)
{
if (DefaultCellStyleFontSize < 0) DefaultCellStyleFontSize = DefaultCellStyle.Font.Size;
DefaultCellStyle.Font = DefaultCellStyle.Font.DPIScaleFont(DefaultCellStyleFontSize);
}
if (RowsDefaultCellStyle.Font != null)
{
if (RowsDefaultCellStyleFontSize < 0) RowsDefaultCellStyleFontSize = RowsDefaultCellStyle.Font.Size;
RowsDefaultCellStyle.Font = RowsDefaultCellStyle.Font.DPIScaleFont(RowsDefaultCellStyleFontSize);
}
}
private readonly Dictionary<string, CellStyle> CellStyles = new Dictionary<string, CellStyle>();
public class CellStyle
{
public int Row { get; set; }
public int Col { get; set; }
public Color BackColor { get; set; }
public Color ForeColor { get; set; }
public CellStyle(int row, int col, Color backColor, Color foreColor)
{
Row = row;
Col = col;
BackColor = backColor;
ForeColor = foreColor;
}
}
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
base.OnCellPainting(e);
if (CellStyles.Count > 0 && e.ColumnIndex >= 0 && e.RowIndex >= 0)
{
object obj = e.Value;
if (obj == null) return;
string key = e.RowIndex + "_" + e.ColumnIndex;
if (CellStyles.ContainsKey(key))
{
e.CellStyle.ForeColor = CellStyles[key].ForeColor;
e.CellStyle.BackColor = CellStyles[key].BackColor;
e.CellStyle.SelectionForeColor = CellStyles[key].ForeColor;
e.CellStyle.SelectionBackColor = CellStyles[key].BackColor;
}
}
}
public void SetCellStyle(int row, int col, Color backColor, Color foreColor)
{
SetCellStyle(new CellStyle(row, col, backColor, foreColor));
}
public void SetCellStyle(CellStyle style)
{
string key = style.Row + "_" + style.Col;
if (CellStyles.ContainsKey(key))
CellStyles[key] = style;
else
CellStyles.Add(key, style);
}
public void ClearCellStyles()
{
CellStyles.Clear();
}
public void ClearCellStyle(int row, int col)
{
string key = row + "_" + col;
if (CellStyles.ContainsKey(key))
{
CellStyles.Remove(key);
}
}
public void SetRowHeight(int height)
{
AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
RowTemplate.Height = height;
}
public void SetColumnHeadersHeight(int height)
{
ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
ColumnHeadersHeight = height;
}
private void HorizontalScrollBar_VisibleChanged(object sender, EventArgs e)
{
SetScrollInfo();
}
private void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)
{
SetScrollInfo();
}
public void Init()
{
//自动生成行
AutoGenerateColumns = false;
2020-05-11 21:11:29 +08:00
//列占满行
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
2020-05-11 21:11:29 +08:00
//禁止调整数据行行高
AllowUserToResizeRows = false;
2020-05-11 21:11:29 +08:00
//允许调整标题行行宽
AllowUserToResizeColumns = true;
//禁用最后一行空白,自动新增行
AllowUserToAddRows = false;
AllowUserToDeleteRows = false;
2020-05-11 21:11:29 +08:00
//不显示表格线
CellBorderStyle = DataGridViewCellBorderStyle.None;
//禁止行多选
2022-04-17 23:34:44 +08:00
MultiSelect = false;
//不显示数据行标题
RowHeadersVisible = false;
2020-05-11 21:11:29 +08:00
//禁止只读
//ReadOnly = false;
2020-05-11 21:11:29 +08:00
//行选
SelectionMode = DataGridViewSelectionMode.FullRowSelect;
}
2020-05-11 21:11:29 +08:00
private bool isLightMode = false;
public void LightMode()
{
AllowUserToAddRows = false;
AllowUserToDeleteRows = false;
AllowUserToResizeColumns = false;
AllowUserToResizeRows = false;
AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
BackgroundColor = System.Drawing.Color.White;
BorderStyle = System.Windows.Forms.BorderStyle.None;
CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal;
ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;
StripeOddColor = System.Drawing.Color.White;
ColumnHeadersDefaultCellStyle.BackColor = Color.White;
ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
ColumnHeadersDefaultCellStyle.SelectionBackColor = Color.White;
ColumnHeadersDefaultCellStyle.SelectionForeColor = Color.Black;
SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
GridColor = Color.LightGray;
isLightMode = true;
}
private void VerticalScrollBar_ValueChanged(object sender, EventArgs e)
{
VBar.Value = FirstDisplayedScrollingRowIndex;
VerticalScrollBarChanged?.Invoke(this, e);
}
2020-05-11 21:11:29 +08:00
private void VBarValueChanged(object sender, EventArgs e)
{
if (RowCount == 0) return;
int idx = VBar.Value;
if (idx < 0) idx = 0;
if (idx >= RowCount) idx = RowCount - 1;
int lastFrozen = GetFrozenBottomIndex();
if (Rows[0].Frozen)
{
if (RowCount > lastFrozen + 1)
{
lastFrozen += 1;
FirstDisplayedScrollingRowIndex = Math.Max(idx, lastFrozen);
}
}
else
{
FirstDisplayedScrollingRowIndex = idx;
}
}
private int GetFrozenBottomIndex()
{
int lastFrozen = 0;
if (Rows[0].Frozen)
{
for (int i = 0; i < Rows.Count; i++)
{
if (Rows[i].Frozen)
{
lastFrozen = i;
}
else
{
break;
}
}
}
return lastFrozen;
2020-05-11 21:11:29 +08:00
}
private void HorizontalScrollBar_ValueChanged(object sender, EventArgs e)
{
HBar.Value = HorizontalScrollBar.Value;
}
2020-05-11 21:11:29 +08:00
private void HBar_ValueChanged(object sender, EventArgs e)
{
HorizontalScrollBar.Value = HBar.Value;
HorizontalScrollingOffset = HBar.Value;
HorizontalScrollBarChanged?.Invoke(this, e);
}
2020-05-11 21:11:29 +08:00
public event EventHandler HorizontalScrollBarChanged;
public event EventHandler VerticalScrollBarChanged;
2020-05-11 21:11:29 +08:00
public void SetScrollInfo()
{
if (VBar == null || HBar == null)
2020-05-11 21:11:29 +08:00
{
return;
}
if (RowCount > DisplayedRowCount(false))
2020-05-11 21:11:29 +08:00
{
VBar.Maximum = RowCount - DisplayedRowCount(false);
VBar.Value = FirstDisplayedScrollingRowIndex;
VBar.Visible = ScrollBars == ScrollBars.Vertical || ScrollBars == ScrollBars.Both;
2020-05-11 21:11:29 +08:00
}
else
{
VBar.Visible = false;
2020-05-11 21:11:29 +08:00
}
if (HorizontalScrollBar.Visible)
{
HBar.Maximum = HorizontalScrollBar.Maximum;
HBar.Value = HorizontalScrollBar.Value;
HBar.BoundsWidth = HorizontalScrollBar.LargeChange;
HBar.LargeChange = HorizontalScrollBar.LargeChange;//.Maximum / VisibleColumnCount();
HBar.Visible = ScrollBars == ScrollBars.Horizontal || ScrollBars == ScrollBars.Both;
}
else
{
HBar.Visible = false;
}
SetBarPosition();
2020-05-11 21:11:29 +08:00
}
2022-06-24 15:04:08 +08:00
/// <summary>
/// 重载绘图
/// </summary>
/// <param name="e">绘图参数</param>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (BorderStyle == BorderStyle.FixedSingle)
{
Color color = RectColor;
color = Enabled ? color : UIDisableColor.Fill;
e.Graphics.DrawRectangle(color, new Rectangle(0, 0, Width - 1, Height - 1));
}
if (isLightMode)
{
e.Graphics.DrawLine(GridColor, 0, ColumnHeadersHeight - 1, Width, ColumnHeadersHeight - 1);
}
}
2020-05-11 21:11:29 +08:00
protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
if (VBar.Visible && ScrollMode == UIDataGridViewScrollMode.Page)
{
if (e.Delta > 10)
{
var lineCount = Rows.GetLastRow(DataGridViewElementStates.Displayed) - FirstDisplayedScrollingRowIndex;
VBar.SetValue(VBar.Value - lineCount + 3);
}
else if (e.Delta < -10)
{
var lineCount = FirstDisplayedScrollingRowIndex - Rows.GetLastRow(DataGridViewElementStates.Displayed);
VBar.SetValue(VBar.Value - lineCount - 3);
}
2020-05-11 21:11:29 +08:00
}
}
[Description("垂直滚动条滚动方式"), Category("SunnyUI")]
[DefaultValue(UIDataGridViewScrollMode.Normal)]
public UIDataGridViewScrollMode ScrollMode { get; set; } = UIDataGridViewScrollMode.Normal;
public enum UIDataGridViewScrollMode
{
/// <summary>
/// 正常
/// </summary>
Normal,
/// <summary>
/// 翻页
/// </summary>
Page
}
2020-05-18 23:25:19 +08:00
protected override void OnRowsAdded(DataGridViewRowsAddedEventArgs e)
{
base.OnRowsAdded(e);
SetScrollInfo();
}
protected override void OnRowsRemoved(DataGridViewRowsRemovedEventArgs e)
{
base.OnRowsRemoved(e);
SetScrollInfo();
}
2022-06-27 17:06:11 +08:00
/// <summary>
/// 重载控件尺寸变更
/// </summary>
/// <param name="e">参数</param>
2020-05-11 21:11:29 +08:00
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
SetScrollInfo();
SetBarPosition();
}
protected override void OnColumnStateChanged(DataGridViewColumnStateChangedEventArgs e)
{
base.OnColumnStateChanged(e);
SetScrollInfo();
}
protected override void OnColumnRemoved(DataGridViewColumnEventArgs e)
{
base.OnColumnRemoved(e);
SetScrollInfo();
}
2020-05-11 21:11:29 +08:00
private void SetBarPosition()
{
if (VBar == null || HBar == null)
{
return;
}
int barWidth = Math.Max(ScrollBarInfo.VerticalScrollBarWidth(), ScrollBarWidth);
int barHeight = Math.Max(ScrollBarInfo.HorizontalScrollBarHeight(), ScrollBarHeight);
if (BorderStyle == BorderStyle.FixedSingle)
{
VBar.Left = Width - barWidth - 2;
VBar.Top = 1;
VBar.Width = barWidth + 1;
VBar.Height = Height - 2;
VBar.BringToFront();
HBar.Left = 1;
HBar.Height = barHeight + 1;
HBar.Width = Width - (VBar.Visible ? VBar.Width : 0) - 2;
HBar.Top = Height - HBar.Height - 1;
HBar.BringToFront();
}
else
{
VBar.Left = Width - barWidth - 1;
VBar.Top = 0;
VBar.Width = barWidth + 1;
VBar.Height = Height;
VBar.BringToFront();
HBar.Left = 0;
HBar.Height = barHeight + 1;
HBar.Width = Width - (VBar.Visible ? VBar.Width : 0);
HBar.Top = Height - HBar.Height;
HBar.BringToFront();
}
2020-05-11 21:11:29 +08:00
}
protected override void OnColumnAdded(DataGridViewColumnEventArgs e)
{
base.OnColumnAdded(e);
//设置可调整标题行行高
if (ColumnHeadersHeightSizeMode == DataGridViewColumnHeadersHeightSizeMode.AutoSize)
{
ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
}
SetScrollInfo();
2020-05-11 21:11:29 +08:00
}
private UIStyle _style = UIStyle.Blue;
/// <summary>
/// 主题样式
/// </summary>
[DefaultValue(UIStyle.Blue), Description("主题样式"), Category("SunnyUI")]
2020-05-11 21:11:29 +08:00
public UIStyle Style
{
get => _style;
set => SetStyle(value);
}
[DefaultValue(typeof(Color), "White")]
[Description("偶数行显示颜色"), Category("SunnyUI")]
2020-05-11 21:11:29 +08:00
public Color StripeEvenColor
{
get => RowsDefaultCellStyle.BackColor;
set
{
RowsDefaultCellStyle.BackColor = value;
Invalidate();
}
}
[DefaultValue(typeof(Color), "243, 249, 255")]
[Description("奇数行显示颜色"), Category("SunnyUI")]
2020-05-11 21:11:29 +08:00
public Color StripeOddColor
{
get => AlternatingRowsDefaultCellStyle.BackColor;
set
{
AlternatingRowsDefaultCellStyle.BackColor = value;
Invalidate();
}
}
2023-11-06 14:08:09 +08:00
/// <summary>
/// 设置主题样式
/// </summary>
/// <param name="style">主题样式</param>
private void SetStyle(UIStyle style)
2020-05-11 21:11:29 +08:00
{
if (!style.IsCustom())
{
SetStyleColor(style.Colors());
Invalidate();
}
2023-11-06 14:08:09 +08:00
_style = style == UIStyle.Inherited ? UIStyle.Inherited : UIStyle.Custom;
}
public void SetInheritedStyle(UIStyle style)
{
SetStyle(style);
_style = UIStyle.Inherited;
2020-05-11 21:11:29 +08:00
}
public void SetStyleColor(UIBaseStyle uiColor)
{
2022-03-21 23:25:57 +08:00
BackgroundColor = uiColor.PlainColor;
//列头部颜色
ColumnHeadersDefaultCellStyle.BackColor = uiColor.GridTitleColor;
ColumnHeadersDefaultCellStyle.ForeColor = uiColor.GridTitleForeColor;
ColumnHeadersDefaultCellStyle.SelectionBackColor = uiColor.GridTitleColor;
//行头部颜色
RowHeadersDefaultCellStyle.BackColor = uiColor.PlainColor;
2022-03-21 23:25:57 +08:00
RowHeadersDefaultCellStyle.ForeColor = uiColor.GridForeColor;
RowHeadersDefaultCellStyle.SelectionBackColor = uiColor.RectColor;
2022-03-21 23:25:57 +08:00
RowHeadersDefaultCellStyle.SelectionForeColor = uiColor.GridForeColor;
2020-05-11 21:11:29 +08:00
2022-03-16 15:10:14 +08:00
//数据单元格选中颜色
2020-05-11 21:11:29 +08:00
DefaultCellStyle.SelectionBackColor = uiColor.GridSelectedColor;
DefaultCellStyle.SelectionForeColor = uiColor.GridSelectedForeColor;
2022-03-16 15:10:14 +08:00
DefaultCellStyle.BackColor = uiColor.GridStripeEvenColor;
2022-03-21 23:25:57 +08:00
DefaultCellStyle.ForeColor = uiColor.GridForeColor;
2022-03-16 15:10:14 +08:00
//数据行选中颜色
RowsDefaultCellStyle.SelectionBackColor = uiColor.GridSelectedColor;
RowsDefaultCellStyle.SelectionForeColor = uiColor.GridSelectedForeColor;
2022-03-21 23:25:57 +08:00
RowsDefaultCellStyle.ForeColor = uiColor.GridForeColor;
2020-05-11 21:11:29 +08:00
GridColor = uiColor.GridLineColor;
RectColor = uiColor.RectColor;
2022-03-21 23:25:57 +08:00
RowsDefaultCellStyle.BackColor = uiColor.GridStripeEvenColor;
AlternatingRowsDefaultCellStyle.BackColor = uiColor.GridStripeOddColor;
2020-05-11 21:11:29 +08:00
StripeEvenColor = uiColor.GridStripeEvenColor;
StripeOddColor = uiColor.GridStripeOddColor;
if (HBar != null)
{
HBar.ForeColor = uiColor.GridBarForeColor;
HBar.HoverColor = uiColor.ButtonFillHoverColor;
HBar.PressColor = uiColor.ButtonFillPressColor;
HBar.FillColor = uiColor.GridBarFillColor;
//HBar.RectColor = uiColor.RectColor;
scrollBarColor = uiColor.GridBarForeColor;
scrollBarBackColor = uiColor.GridBarFillColor;
}
if (VBar != null)
{
VBar.ForeColor = uiColor.GridBarForeColor;
VBar.HoverColor = uiColor.ButtonFillHoverColor;
VBar.PressColor = uiColor.ButtonFillPressColor;
VBar.FillColor = uiColor.GridBarFillColor;
scrollBarRectColor = VBar.RectColor = uiColor.RectColor;
scrollBarColor = uiColor.GridBarForeColor;
scrollBarBackColor = uiColor.GridBarFillColor;
}
2020-05-11 21:11:29 +08:00
}
/// <summary>
/// 自定义主题风格
/// </summary>
2023-11-06 14:08:09 +08:00
[DefaultValue(false), Browsable(false)]
[Description("获取或设置可以自定义主题风格"), Category("SunnyUI")]
2020-05-11 21:11:29 +08:00
public bool StyleCustomMode { get; set; }
public string Version => UIGlobal.Version;
/// <summary>
/// Tag字符串
/// </summary>
[DefaultValue(null)]
[Description("获取或设置包含有关控件的数据的对象字符串"), Category("SunnyUI")]
2020-05-11 21:11:29 +08:00
public string TagString { get; set; }
protected override void OnCellBorderStyleChanged(EventArgs e)
2020-05-11 21:11:29 +08:00
{
base.OnCellBorderStyleChanged(e);
VBar.ShowLeftLine = CellBorderStyle == DataGridViewCellBorderStyle.Single;
2020-05-11 21:11:29 +08:00
}
private Color _rectColor = UIColor.Blue;
[DefaultValue(typeof(Color), "80, 160, 255")]
[Description("边框颜色"), Category("SunnyUI")]
2020-05-11 21:11:29 +08:00
public Color RectColor
{
get => _rectColor;
set
{
if (_rectColor != value)
{
_rectColor = value;
Invalidate();
}
}
}
[Browsable(false)]
public int SelectedIndex
{
get
{
return CurrentRow != null ? CurrentRow.Index : -1;
}
2020-05-11 21:11:29 +08:00
set
{
2022-03-01 23:04:17 +08:00
//BindingContext[DataSource].Position = value;
2020-05-11 21:11:29 +08:00
if (Rows.Count == 0)
{
return;
}
if (value >= 0 && value < Rows.Count)
{
foreach (DataGridViewRow row in SelectedRows)
{
row.Selected = false;
}
2020-05-11 21:11:29 +08:00
Rows[value].Selected = true;
int lastFrozen = GetFrozenBottomIndex();
if (Rows[0].Frozen)
{
if (RowCount > lastFrozen + 1)
{
lastFrozen += 1;
FirstDisplayedScrollingRowIndex = Math.Max(value, lastFrozen);
}
}
else
{
FirstDisplayedScrollingRowIndex = value;
}
if (selectedIndex >= 0 && selectedIndex <= Rows.Count)
jumpIndex = selectedIndex;
selectedIndex = value;
2020-05-11 21:11:29 +08:00
SelectIndexChange?.Invoke(this, value);
}
}
}
private int jumpIndex = -1;
2020-05-11 21:11:29 +08:00
protected override void OnDataSourceChanged(EventArgs e)
{
base.OnDataSourceChanged(e);
SetScrollInfo();
}
public delegate void OnSelectIndexChange(object sender, int index);
public event OnSelectIndexChange SelectIndexChange;
protected override void OnRowEnter(DataGridViewCellEventArgs e)
2020-05-11 21:11:29 +08:00
{
base.OnRowEnter(e);
2020-05-11 21:11:29 +08:00
if (e.RowIndex == jumpIndex)
{
jumpIndex = -1;
return;
}
if (selectedIndex != e.RowIndex)
2020-05-11 21:11:29 +08:00
{
selectedIndex = e.RowIndex;
SelectIndexChange?.Invoke(this, e.RowIndex);
}
}
private int selectedIndex = -1;
2020-05-11 21:11:29 +08:00
public DataGridViewColumn AddColumn(string columnName, string dataPropertyName, int fillWeight = 100, DataGridViewContentAlignment alignment = DataGridViewContentAlignment.MiddleCenter, bool readOnly = true)
{
DataGridViewColumn column = new DataGridViewTextBoxColumn();
column.HeaderText = columnName;
column.DataPropertyName = dataPropertyName;
column.Name = columnName;
column.ReadOnly = readOnly;
column.FillWeight = fillWeight;
column.SortMode = DataGridViewColumnSortMode.NotSortable;
column.DefaultCellStyle.Alignment = alignment;
Columns.Add(column);
return column;
}
public DataGridViewColumn AddCheckBoxColumn(string columnName, string dataPropertyName, int fillWeight = 100, bool readOnly = true)
{
DataGridViewColumn column = new DataGridViewCheckBoxColumn();
column.HeaderText = columnName;
column.DataPropertyName = dataPropertyName;
column.Name = columnName;
column.ReadOnly = readOnly;
column.FillWeight = fillWeight;
column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
Columns.Add(column);
return column;
}
2020-07-28 21:01:40 +08:00
public DataGridViewColumn AddButtonColumn(string columnName, string dataPropertyName, int fillWeight = 100, bool readOnly = true)
{
DataGridViewColumn column = new DataGridViewButtonColumn();
column.HeaderText = columnName;
column.DataPropertyName = dataPropertyName;
column.Name = columnName;
column.ReadOnly = readOnly;
column.FillWeight = fillWeight;
column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
Columns.Add(column);
return column;
}
public virtual void ClearRows()
2020-05-11 21:11:29 +08:00
{
if (DataSource != null)
{
DataSource = null;
}
Rows.Clear();
}
public virtual void ClearColumns()
2020-05-11 21:11:29 +08:00
{
Columns.Clear();
}
public virtual void ClearAll()
2020-05-11 21:11:29 +08:00
{
ClearRows();
ClearColumns();
}
public int AddRow(params object[] values)
{
return Rows.Add(values);
}
protected override bool ProcessDialogKey(Keys keyData)
{
if (EnterAsTab)
{
Keys key = (keyData & Keys.KeyCode);
if (key == Keys.Enter)
{
//交由自定义控件处理
return false;
}
}
return base.ProcessDialogKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (EnterAsTab)
{
if (e.KeyCode == Keys.Enter)
{
return this.ProcessTabKey(e.KeyData);
}
}
return base.ProcessDataGridViewKey(e);
}
[DefaultValue(false)]
[Description("编辑输入时用Enter键代替Tab键跳到下一个单元格"), Category("SunnyUI")]
public bool EnterAsTab { get; set; }
private Color scrollBarColor = Color.FromArgb(80, 160, 255);
/// <summary>
/// 填充颜色,当值为背景色或透明色或空值则不填充
/// </summary>
2022-05-26 11:03:06 +08:00
[Description("滚动条填充颜色"), Category("SunnyUI")]
[DefaultValue(typeof(Color), "80, 160, 255")]
public Color ScrollBarColor
{
get => scrollBarColor;
set
{
scrollBarColor = value;
HBar.HoverColor = HBar.PressColor = HBar.ForeColor = value;
VBar.HoverColor = VBar.PressColor = VBar.ForeColor = value;
_style = UIStyle.Custom;
Invalidate();
}
}
private Color scrollBarRectColor = Color.FromArgb(80, 160, 255);
public Color ScrollBarRectColor
{
get => scrollBarRectColor;
set
{
scrollBarRectColor = value;
VBar.RectColor = value;
_style = UIStyle.Custom;
Invalidate();
}
}
private Color scrollBarBackColor = Color.FromArgb(243, 249, 255);
/// <summary>
/// 填充颜色,当值为背景色或透明色或空值则不填充
/// </summary>
2022-05-26 11:03:06 +08:00
[Description("滚动条背景颜色"), Category("SunnyUI")]
[DefaultValue(typeof(Color), "243, 249, 255")]
public Color ScrollBarBackColor
{
get => scrollBarBackColor;
set
{
scrollBarBackColor = value;
HBar.FillColor = value;
VBar.FillColor = value;
_style = UIStyle.Custom;
Invalidate();
}
}
2020-05-11 21:11:29 +08:00
}
public static class UIDataGridViewHelper
{
public static DataGridViewColumn SetFixedMode(this DataGridViewColumn column, int width)
{
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
column.Width = width;
return column;
}
2020-05-27 17:26:21 +08:00
public static DataGridViewColumn SetSortMode(this DataGridViewColumn column, DataGridViewColumnSortMode sortMode = DataGridViewColumnSortMode.Automatic)
{
column.SortMode = sortMode;
return column;
}
public static bool IsDBNull(this DataGridViewCell cell)
{
return cell.Value is DBNull;
}
2020-05-11 21:11:29 +08:00
}
}