namespace Common.Components
{
public enum DataGridViewAutoIndexMode
{
NewColumn = 1,
RowHeader = 0,
None = 2
}
public partial class DataGridViewPagingSumCtrl : UserControl
{
public void SetDataSource<T>(List<T> list)
{
DisableEvents();
DisableColumnsResizeEvent();
this.dataGridView.DataSource = null;
SetColumnsResizeEvent();
if (list != null && list.Count > 0)
{
DataSource = list;
}
EnableEvents();
}
/// <summary>
/// 返回菜单组件
/// </summary>
public ContextMenuStrip InnerContextMenuStrip
{
get
{
return this.contextMenuStripDataGridView;
}
}
public ESBasic.Action<String, bool> ColumnSorting;
/// <summary>
/// 检查是否显示统计信息,默认不显示
/// </summary>
// private Boolean showSummaryRows = false;
private const string NEW_COLUMN_NAME_DATETIME_TO_STR = "_DATETIME_TO_STR";
private bool showRowCounts = true;
public bool ShowRowCounts
{
get
{
return showRowCounts;
}
set
{
showRowCounts = value;
skinLabelTotalCount.Visible = value;
SetVisible();
}
}
/// <summary>
/// 增加序号
/// </summary>
public bool AutoIndex
{
get { return dataGridView.Columns.Contains(autoIndexColumn); }
set
{
if (value)
{
if (!dataGridView.Columns.Contains(autoIndexColumn))
{
AddIndexRow();
SetStyle();
}
}
else
{
if (dataGridView.Columns.Contains(autoIndexColumn))
{
dataGridView.Columns.Remove(autoIndexColumn);
}
}
}
}
//这个要在调用初始化的时候先使用,否则字段模式会变成NOSET,或者直接使用SpecAutoSizeMode设置即可
public void SpecAutoSizeModeColumns(DataGridViewColumn[] dataGridViewColumn)
{
foreach (var item in dataGridViewColumn)
{
SpecAutoSizeMode(new TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode>(item, item.AutoSizeMode));
}
}
/// <summary>
/// 解决排序时闪烁的问题,多次变更当前行,致使页面多次刷新,还有重新排序时,禁用刷新页面
///</summary>
public EventHandler SelectionChanged
{
get { return selectionChanged; }
set
{
selectionChanged = value;
// dataGridView.SelectionChanged
}
}
// internal Delegate selectionChanged;
private EventHandler selectionChanged;
private static string[] ROW_HEADERS = new string[] { "小计", "总计" };
private DataGridView dataGridView;
private bool isPaging;
// private int calRowsCount;
private PageControlPanel PageControlPanel { get; set; }
private List<TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode>> specAutoSizeMode;
/// <summary>
/// 设定特定列的显示方式
/// </summary>
/// <param name="keyValue"></param>
public void SpecAutoSizeMode(TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode> keyValue)
{
if (specAutoSizeMode == null)
{
specAutoSizeMode = new List<TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode>>();
}
specAutoSizeMode.Add(keyValue);
}
/// <summary>
/// 总页数
/// </summary>
private int pageCount;
/// <summary>
/// 当前页数
/// </summary>
private int currentPageIndex;
private DataTable SourceDataTable { get; set; }
/// <summary>
/// 要进行统计的列绑定字段
/// </summary>
// public List<DataGirdViewCalculateColumn> CalculateColumns { get; internal set; }
public string[] ColumnDataPropertyNames { get; internal set; }
private CbGeneric<int> CurrentPageIndexChanged;
public CbGeneric<int> SelectionChange;
internal void Change_Color(int rowIndex, int columnIndex)
{
dataGridView.Rows[rowIndex].Cells[columnIndex].ReadOnly = true;
DataGridViewCell cell = new DataGridViewTextBoxCell();
cell.Style.BackColor = Color.Wheat;
//cell.ReadOnly = true;
cell.Value = "N";
cell.Style.BackColor = Color.White;
dataGridView.Rows[rowIndex].Cells[columnIndex] = cell;
dataGridView.Rows[rowIndex].Cells[columnIndex].Style.ForeColor = Color.White;
dataGridView.Rows[rowIndex].Cells[columnIndex].Style.SelectionBackColor = Color.White;
dataGridView.Rows[rowIndex].Cells[columnIndex].Style.SelectionForeColor = Color.White;
}
/// <summary>
/// 在第一次传参时设置排序参数的默认查询结果,供OrderSearch调用,这个跟服务端功能关系有点多
/// </summary>
public BaseOrderPara OrderPara { get; set; }
public CbGeneric<Object, EventArgs> PageSizeChange { get; set; }
public int PageSize
{
get
{
int value = 0;
try
{
value = int.Parse(this.skinComboBoxPageSize.Text);
}
catch (Exception ex)
{
value = (int)this.skinComboBoxPageSize.SelectedValue;
}
return value;
}
}
public bool[] abs4Column { get; internal set; }
/// <summary>
/// 初始化后调用Search事件调用服务端查询 dataGridViewPagingSumCtrl.OrderSearch += Search;
/// </summary>
public ESBasic.Action<Object, EventArgs> OrderSearch;
public DataGridViewCellFormattingEventHandler CellFormatting;
internal void Clear()
{
this.dataGridView.DataSource = null;
this.pageControlPanel21.Initialize(1);
}
///没有分页的
public DataGridViewPagingSumCtrl(DataGridView view, string[] calculateColumns = null)
{
InitializeComponent();
this.dataGridView = view;
summaryControlContainer1.DGV = view;
summaryControlContainer2.DGV = view;
ColumnDataPropertyNames = calculateColumns;
this.isPaging = false;
}
/// <summary>
/// 需要分页的
/// </summary>
/// <param name="view"></param>
/// <param name="calculateColumns"></param>
/// <param name="CurrentPageIndexChanged"></param>
/// <param name="PageSizeChange"></param>
/// <param name="pagePara">排序的时候使用</param>
public DataGridViewPagingSumCtrl(DataGridView view, CbGeneric<int> CurrentPageIndexChanged, CbGeneric<object, EventArgs> PageSizeChange, string[] calculateColumns = null)
{
InitializeComponent();
this.dataGridView = view;
this.isPaging = true;
summaryControlContainer1.DGV = view;
summaryControlContainer2.DGV = view;
ColumnDataPropertyNames = calculateColumns;
this.CurrentPageIndexChanged = CurrentPageIndexChanged;
// Initialize();
}
private void SetColumnsResizeEvent()
{
DisableColumnsResizeEvent();
dataGridView.Resize += DataGridView_Resize;
dataGridView.RowHeadersWidthChanged += DataGridView_RowHeadersWidthChanged;
dataGridView.DataSourceChanged += DataGridView_DataSourceChanged;
dataGridView.CellFormatting += DataGridView_CellFormatting;
}
private void DisableColumnsResizeEvent()
{
dataGridView.Resize -= DataGridView_Resize;
dataGridView.DataSourceChanged -= DataGridView_DataSourceChanged;
dataGridView.RowHeadersWidthChanged -= DataGridView_RowHeadersWidthChanged;
dataGridView.CellFormatting -= DataGridView_CellFormatting;
}
private void SetPrivateEvent()
{ //分页标签索引改变时触发
// DisablePrivateEvent();
this.dataGridView.DataBindingComplete += DataGridView_DataBindingComplete;
pageControlPanel21.CurrentPageIndexChanged += PageControlPanel21_CurrentPageIndexChanged;
dataGridView.DataError += DataGridView_DataError;
this.dataGridView.CellMouseDown += DataGridView_CellMouseDown;
dataGridView.ColumnHeaderMouseClick += dataGridView1_ColumnHeaderMouseClick;
dataGridView.KeyDown += DataGridView_KeyDown;
// dataGridView.RowStateChanged += DataGridView_RowStateChanged;
}
//private void DisablePrivateEvent()
//{
// DisableColumnsResizeEvent();
// this.dataGridView.DataBindingComplete -= DataGridView_DataBindingComplete;
// pageControlPanel21.CurrentPageIndexChanged -= PageControlPanel21_CurrentPageIndexChanged;
// dataGridView.DataError -= DataGridView_DataError;
// this.dataGridView.CellMouseDown -= DataGridView_CellMouseDown;
// dataGridView.ColumnHeaderMouseClick -= dataGridView1_ColumnHeaderMouseClick;
// dataGridView.KeyDown -= DataGridView_KeyDown;
//}
public new void DoubleBuffered(bool buffered)
{
if (dataGridView != null)
{
dataGridView.DoubleBuffered(buffered);
}
}
/// <summary>
/// 自动定焦点到指定的可写单元格内
/// </summary>
public void AutoFocusToWritableCell()
{
DataGridViewUtil.AutoFocusToFirstWritableCell(this.dataGridView);
}
//自动滚动到最后一行
public void ScrollToEnd()
{
if (dataGridView != null && dataGridView.RowCount > 0)
{
int index = dataGridView.RowCount - 1;
DataGridViewUtil.ScrollToRowIndex(dataGridView,index);
}
}
public void ScrollToRowIndex(int index)
{
DataGridViewUtil.ScrollToRowIndex(dataGridView, index);
}
private void DataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
// CommonGlobalUtil.WriteLog("DataGridView_DataError");
if (e.Exception != null)
{
CommonGlobalUtil.WriteLog(e.Exception);
}
e.Cancel = false;
}
private void DataGridView_DataSourceChanged(object sender, EventArgs e)
{
if (DataSource == null)
{
// CommonGlobalUtil.WriteLog("DataGridView_DataSourceChanged");
// ClearSummary();
}
}
private void DataGridView_RowHeadersWidthChanged(object sender, EventArgs e)
{
// DisableColumnsResizeEvent();
// CommonGlobalUtil.WriteLog("DataGridView_RowHeadersWidthChanged");
SetStyle();
// SetColumnsResizeEvent();
}
private void DataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
try
{
if (e.RowIndex < 0 || e.ColumnIndex < 0)
{
return;
}
if (dataGridView.Columns[e.ColumnIndex].ValueType == typeof(DateTime))
{
if (String.IsNullOrEmpty(e?.Value.ToString()) || SystemDefault.DateTimeNull == (DateTime)e?.Value)
{
e.Value = null;
}
}
switch (AutoIndexMode)
{
case DataGridViewAutoIndexMode.NewColumn:
if (e.ColumnIndex == autoIndexColumn.Index)
{
String item = dataGridView.Rows[e.RowIndex].HeaderCell.Value?.ToString();
if (!this.IsUnSelectedableRow(dataGridView.Rows[e.RowIndex]))
{
e.Value = (e.RowIndex + 1) + currentPageIndex * PageSize;
}
if (IsEmptyRowHeader(dataGridView.Rows[e.RowIndex]))
{
e.Value = String.Empty;
}
}
break;
case DataGridViewAutoIndexMode.RowHeader:
// dataGridView.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1) + currentPageIndex * PageSize;
break;
case DataGridViewAutoIndexMode.None:
break;
default:
break;
}
}
catch (Exception ex) {
CommonGlobalUtil.WriteLog(ex);
}
}
private void DataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
DataGridView view = sender as DataGridView;
if (e.Button == System.Windows.Forms.MouseButtons.Right && e.ColumnIndex > -1 && e.RowIndex > -1) //点击的是鼠标右键,并且不是表头
{
//右键选中单元格
view.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
contextMenuStripDataGridView.Show(MousePosition.X, MousePosition.Y); //MousePosition.X, MousePosition.Y 是为了让菜单在所选行的位置显示
}
}
private void DataGridView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
//查找下一个tab控件
this.TopLevelControl.SelectNextControl(this, true, true, true, true);
}
}
private void DataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
DisableColumnsResizeEvent();
switch (AutoIndexMode)
{
case DataGridViewAutoIndexMode.NewColumn:
break;
case DataGridViewAutoIndexMode.RowHeader:
foreach (DataGridViewRow item in this.dataGridView.Rows)
{
// item.HeaderCell.Style.Alignment = DataGridViewContentAlignment.NotSet;
if (!this.IsUnSelectedableRow(item))
{
this.dataGridView.RowHeadersWidthChanged -= DataGridView_RowHeadersWidthChanged;
item.HeaderCell.Value = string.Format("{0}", (item.Index + 1) + currentPageIndex * PageSize);
this.dataGridView.RowHeadersWidthChanged += DataGridView_RowHeadersWidthChanged;
}
if (IsEmptyRowHeader(item))
{
this.dataGridView.RowHeadersWidthChanged -= DataGridView_RowHeadersWidthChanged;
item.HeaderCell.Value = String.Empty;
this.dataGridView.RowHeadersWidthChanged += DataGridView_RowHeadersWidthChanged;
}
}
break;
case DataGridViewAutoIndexMode.None:
break;
default:
break;
}
if (DataSource != null)
{
// CommonGlobalUtil.WriteLog("DataGridView_DataBindingComplete");
SetStyle();
// ESBasic.CbGeneric cb = new ESBasic.CbGeneric(this.FormatColumns);
// cb.BeginInvoke(null, null);
}
if (!isPaging)
{
//if (ColumnDataPropertyNames != null)
//{
// if (dataGridView.Rows.Count > 0)
// {
// skinLabelTotalCount.Text = "共" + (dataGridView.Rows.Count - 1).ToString() + "行";
// }
//}
//else
//{
skinLabelTotalCount.Text = "共" + dataGridView.Rows.Count.ToString() + "行";
skinLabelTotalCount.Visible = dataGridView.Visible;
//}
}
SetColumnsResizeEvent();
}
private int lastWidth;
private int lastHeight;
private void DataGridView_Resize(object sender, EventArgs e)
{
if (lastWidth != dataGridView.Width || lastHeight != dataGridView.Height)
{
lastWidth = dataGridView.Width;
lastHeight = dataGridView.Height;
// CommonGlobalUtil.WriteLog("DataGridView_Resize");
// DisableColumnsResizeEvent();
SetStyle();
// SetColumnsResizeEvent();
}
}
private Boolean setStyle = true;
public void DisableStyle() {
setStyle = false;
}
public void EnableStyle()
{
setStyle = true;
SetStyle();
}
/// <summary>
/// 重新调用界面重刷,有头标题改变时也要重调
/// </summary>
/// <param name="isInitialize"></param>
private void SetStyle(Boolean isInitialize = false, DataGridViewAutoSizeColumnsMode mode = DataGridViewAutoSizeColumnsMode.DisplayedCells)
{
if (!setStyle) { return; }
// setStyle = true;
// CommonGlobalUtil.WriteLog("SetStyle");
// DisableColumnsResizeEvent();
try
{
if (CommonGlobalUtil.EngineUnconnectioned(this)) { return; }
//CheckRowHeader这里调会闪到界面
// CheckRowHeader();
//20180531 界面根据内容全部显示...除了备注
//不能使用allcells 一般尽量使用NONE,实在不行就用AllCells
dataGridView.AutoSizeColumnsMode = mode;
// dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;
int width = this.dataGridView.Size.Width;
//去掉头宽度,剩余比例分配
width = width - this.dataGridView.RowHeadersWidth;
//获取列数和列标题长度
int columnCount = this.dataGridView.ColumnCount;
int columnHeaderCount = 0;
foreach (DataGridViewColumn item in this.dataGridView.Columns)
{
if (item.Visible)
{
SetAlignment(item);
if (!this.dataGridView.AllowUserToOrderColumns)
{
item.SortMode = DataGridViewColumnSortMode.NotSortable;
}
// item.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
//设置长度为标题的长相关
item.Resizable = DataGridViewTriState.True;
item.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
//20180531新增判断,如果有特定的列格式,则以这个格式计算适应长度
if (specAutoSizeMode != null && specAutoSizeMode.Exists(t => t.Key == item))
{
TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode> keyValue = specAutoSizeMode.Find(t => t.Key == item);
if (keyValue != null)
{
item.AutoSizeMode = keyValue.Value;
//noset,none,fill会报错20180614,修改盘点时
switch (keyValue.Value)
{
case DataGridViewAutoSizeColumnMode.NotSet:
case DataGridViewAutoSizeColumnMode.None:
case DataGridViewAutoSizeColumnMode.Fill:
item.Width = item.GetPreferredWidth(GetDataGridViewAutoSizeColumnMode(mode), true);
break;
default:
// if (CheckAutoSizeMode(keyValue.Value)) {
item.Width = item.GetPreferredWidth(keyValue.Value, true);
// }
break;
}
//不能是noset/none/fill
// if (CheckAutoSizeMode(keyValue.Value))
//{
item.Width = item.GetPreferredWidth(keyValue.Value, true);
//}
}
}
else if (ValidateUtil.IsNumericType(item.ValueType))
{
//item.Width = item.HeaderText.Length * 20;
//根据类型判断 数字
int headerWidth = item.GetPreferredWidth(DataGridViewAutoSizeColumnMode.ColumnHeader, true);
//数字默认撑满,但是计算肯定慢,初始的时候不需要撑满,拉动的时候也不需要
if (isInitialize)
{
int AllCellsWidth = item.GetPreferredWidth(GetDataGridViewAutoSizeColumnMode(mode), true);
item.Width = AllCellsWidth > headerWidth ? AllCellsWidth : headerWidth;
}
else
{
int AllCellsWidth = item.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);
item.Width = AllCellsWidth > headerWidth ? AllCellsWidth : headerWidth;
}
}
else
{
item.Width = item.GetPreferredWidth(GetDataGridViewAutoSizeColumnMode(mode), true);
}
// }
item.FillWeight = item.Width;
// item.GetPreferredWidth(DataGridViewAutoSizeColumnMode.ColumnHeader, true);
item.MinimumWidth = item.Width;
columnHeaderCount += item.Width;
// item.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
//标题总长度
SetColumnAutoSizeMode(item);
}
}
// dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
// 如果
//行标题宽度会影响整个datagridview的长度20180524,数据加载前没有标题,加载后标题长了。
if (columnHeaderCount <= width)
{
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
if (isInitialize)
{
if (specAutoSizeMode != null && specAutoSizeMode.Count > 0)
{
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
}
else
{
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
}
else
{
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
}
}
catch (Exception ex)
{
// CommonGlobalUtil.ShowError(ex);
}
finally
{
CommonGlobalUtil.UnLockPage(this);
}
//}
// SetColumnsResizeEvent();
}
/// <summary>
/// 这个接口未必使用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="totalRow"></param>
//public void ReLoadSummary<T>(T totalRow) where T : class, new()
//{
// ClearSummary();
// if (dataGridView.DataSource != null)
// {
// if (dataGridView.DataSource != null && dataGridView.DataSource is DataTable)
// {
// if (totalRow != null)
// {
// List<T> list = new List<T>();
// list.Add(totalRow);
// ShowSummary(dataGridView, list, ColumnDataPropertyNames);
// }
// else
// {
// DataRow dr = DataGridViewUtil.GetSumRow(dataGridView.DataSource as DataTable, ColumnDataPropertyNames);
// ShowSummary(dr, ColumnDataPropertyNames);
// }
// }
// else
// {
// List<T> calList = new List<T>();
// List<T> list = dataGridView.DataSource as List<T>;
// DataGridViewHelper.AddSumRow1(dataGridView, list, calList, ColumnDataPropertyNames, abs4Column);
// // DataGridViewHelper.AddSumRow1<T>(dataGridView, list, calList, ColumnDataPropertyNames, abs4Column);
// if (totalRow != null)
// {
// IStatisticabled obj = totalRow as IStatisticabled;
// if (obj != null)
// {
// obj.IsStatistics = true;
// }
// calList.Add(totalRow);
// }
// ShowSummary(dataGridView, calList, ColumnDataPropertyNames);
// }
// }
//}
private void CheckRowHeader()
{
switch (this.autoIndexMode)
{
case DataGridViewAutoIndexMode.NewColumn:
break;
case DataGridViewAutoIndexMode.RowHeader:
////加上序号
this.dataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
this.dataGridView.RowHeadersWidth = 70;
dataGridView.RowHeadersDefaultCellStyle.ForeColor = Color.Black;
dataGridView.RowHeadersDefaultCellStyle.Font = new Font(DataGridView.DefaultFont, FontStyle.Regular);
// dataGridView.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
break;
case DataGridViewAutoIndexMode.None:
break;
default:
break;
}
this.dataGridView.Refresh();
}
private DataGridViewAutoSizeColumnMode GetDataGridViewAutoSizeColumnMode(DataGridViewAutoSizeColumnsMode mode)
{
DataGridViewAutoSizeColumnMode columnMode = DataGridViewAutoSizeColumnMode.NotSet;
switch (mode)
{
case DataGridViewAutoSizeColumnsMode.AllCells:
columnMode = DataGridViewAutoSizeColumnMode.AllCells;
break;
case DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader:
columnMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
break;
case DataGridViewAutoSizeColumnsMode.DisplayedCells:
columnMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
break;
case DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader:
columnMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader;
break;
case DataGridViewAutoSizeColumnsMode.None:
columnMode = DataGridViewAutoSizeColumnMode.None;
break;
case DataGridViewAutoSizeColumnsMode.ColumnHeader:
columnMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
break;
case DataGridViewAutoSizeColumnsMode.Fill:
columnMode = DataGridViewAutoSizeColumnMode.Fill;
break;
default:
break;
}
return columnMode;
}
private void SetColumnAutoSizeMode(DataGridViewColumn item)
{
if (!item.Frozen)
{
if (item.GetType() == typeof(DataGridViewLinkColumn))
{
item.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
else if (item.ValueType == typeof(DateTime))
{
item.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
}
else
{
item.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
}
}
}
private void SetAlignment(DataGridViewColumn item)
{
item.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
item.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
if (item.ValueType == typeof(DateTime))
{
if (String.IsNullOrEmpty(item.DefaultCellStyle.Format))
{
item.DefaultCellStyle.Format = DateTimeUtil.DEFAULT_DATETIME_FORMAT;
}
// item.ValueType = typeof(String);
}
else if (item.ValueType == typeof(Date))
{
if (String.IsNullOrEmpty(item.DefaultCellStyle.Format))
{
item.DefaultCellStyle.Format = DateTimeUtil.DEFAULT_DATE_FORMAT;
}
}
else
if (ValidateUtil.IsNumericType(item.ValueType))
{
item.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}
}
private EventHandlerList GetEventHandlerList()
{
PropertyInfo propertyInfo = dataGridView.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList eventList = null;
if (propertyInfo != null)
{
eventList = (EventHandlerList)propertyInfo.GetValue(dataGridView, null);
}
return eventList;
}
/// <summary>
/// 获取对应事件的委托
/// </summary>
//private void GetDelegate() {
// EventHandlerList eventList = GetEventHandlerList();
// // FieldInfo[] fieldInfos= dataGridView.GetType().GetFields(BindingFlags.Static | BindingFlags.NonPublic);
// FieldInfo fieldInfo = dataGridView.GetType().GetField("EVENT_DATAGRIDVIEWSELECTIONCHANGED", BindingFlags.Static | BindingFlags.NonPublic);
// if (fieldInfo != null)
// {
// Delegate delegateInfo = eventList[fieldInfo.GetValue(dataGridView)];
// if (delegateInfo != null)
// {
// Delegate[] delegateList = delegateInfo.GetInvocationList();
// foreach (Delegate dInfo in delegateList)
// {
// // selectionChanged = dInfo;
// }
// }
// }
//}
public void Initialize()
{
try
{
// GetDelegate();
DisableEvents();
// dataGridView.SelectionChanged+= selectionChanged;
// dataGridView.SelectionChanged-= selectionChanged;
// this.Events
/* 下面的代码是用来获取btnDemo的Click事件注册的方法的 */
panel5.Visible = false;
switch (this.autoIndexMode)
{
case DataGridViewAutoIndexMode.NewColumn:
////加上序号
AddIndexRow();
break;
case DataGridViewAutoIndexMode.RowHeader:
//放在SETSTYLE链接界面会闪
//dataGridView.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
CheckRowHeader();
break;
case DataGridViewAutoIndexMode.None:
break;
default:
break;
}
this.pageControlPanel21.Visible = false;
//if (this.IsInitialized())
//{
// return;
//}
// int[] size = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ,};
List<ListItem<int>> list = new List<ListItem<int>>();
for (int i = 1; i < 11; i++)
{
int value = i * 10;
list.Add(new ListItem<int>(value.ToString(), value));
}
list.Add(new ListItem<int>("最大", int.MaxValue));
skinComboBoxPageSize.DisplayMember = "Key";
skinComboBoxPageSize.ValueMember = "Value";
this.skinComboBoxPageSize.DataSource = list;
skinComboBoxPageSize.SelectedIndex = 1;
//设置单选
this.dataGridView.MultiSelect = false;
this.dataGridView.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
this.dataGridView.AllowUserToResizeRows = false;
//已优化:
//先设置AutoSizeRowsMode = none; 很重要,
//我的就是因为是allcell所以很慢,修改后快多了。
DoubleBufferedGridView();
this.dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
//设置列头样式
this.dataGridView.AllowUserToResizeColumns = true;
//this.dataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
//this.dataGridView.RowHeadersWidth = 70;
this.dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
this.dataGridView.BackgroundColor = Color.White;
//设置列自适应
//如果是linkcolumn那么就是allCell mode
//this.dataGridView.= false;
//设置右键菜单
this.dataGridView.ContextMenuStrip = this.contextMenuStripDataGridView;
Control parent = this.dataGridView.Parent;
ControlCollection collection = parent.Controls;
int index = 0;
for (int i = 0; i < collection.Count; i++)
{
Control ctrl = collection[i];
if (ctrl == this.dataGridView)
{
index = i;
break;
}
}
// this.panel1.Dock = this.DataGridView.Dock;
this.Dock = this.dataGridView.Dock;
this.Anchor = this.dataGridView.Anchor;
if (this.dataGridView.Dock == DockStyle.None)
{
this.Size = this.dataGridView.Size;
this.Location = this.dataGridView.Location;
}
this.dataGridView.Dock = DockStyle.Fill;
this.panel4.Controls.Add(this.dataGridView);
parent.Controls.Add(this);
parent.Controls.SetChildIndex(this, index);
this.TabIndex = dataGridView.TabIndex;
this.BringToFront();
this.dataGridView.BringToFront();
this.dataGridView.AccessibleName = "DataGridViewPagingSumCtrl";
this.PageSizeChange = PageSizeChange;
SetVisible();
//skinPanel2.Visible = isPaging;
ClearSummary();
SetStyle(true);
SetPrivateEvent();
}
catch (Exception ex)
{
CommonGlobalUtil.ShowError(ex);
}
}
private void SetVisible()
{
this.pageControlPanel21.Visible = isPaging;
this.skinComboBoxPageSize.Visible = isPaging;
this.skinLabel1.Visible = isPaging;
this.skinPanel2.Visible = this.showRowCounts || isPaging;
}
private DataGridViewTextBoxColumn autoIndexColumn = null;
public DataGridViewTextBoxColumn AutoIndexColumn { get { return autoIndexColumn; } }
private DataGridViewAutoIndexMode autoIndexMode = DataGridViewAutoIndexMode.RowHeader;
/// <summary>
/// 设置是否添加序列
/// </summary>
public DataGridViewAutoIndexMode AutoIndexMode { get { return autoIndexMode; } set { autoIndexMode = value; } }
private Object DataSource
{
get { return this.dataGridView.DataSource; }
set
{
DisableEvents();
this.dataGridView.DataSource = value;
EnableEvents();
}
}
private void AddIndexRow()
{
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
column.HeaderText = "序号";
column.Name = "AutoIndexColumn";
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
column.SortMode = DataGridViewColumnSortMode.NotSortable;
autoIndexColumn = column;
column.Frozen = true;
dataGridView.Columns.Insert(0, column);
// dataGridView.Columns["AutoIndexColumn"].DisplayIndex = 0;//调整列顺序
// column.DisplayIndex = 0;
}
private void DoubleBufferedGridView()
{
Type dgvType = this.dataGridView.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(this.dataGridView, true, null);
}
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
try
{
DataGridView dgv = sender as DataGridView;
if (dgv.Columns[e.ColumnIndex].SortMode != DataGridViewColumnSortMode.NotSortable)
{
string columnBindingName = dgv.Columns[e.ColumnIndex].DataPropertyName;
switch (dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection)
{
case System.Windows.Forms.SortOrder.None:
case System.Windows.Forms.SortOrder.Ascending:
CustomSort(columnBindingName, false);
dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Descending;
break;
case System.Windows.Forms.SortOrder.Descending:
CustomSort(columnBindingName, true);
dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Ascending;
break;
}
}
}
catch (Exception ex)
{
CommonGlobalUtil.ShowError(ex);
}
}
/// <summary>
/// 关闭一些界面显示影响的事件
/// </summary>
private void DisableEvents()
{
if (selectionChanged != null)
{
//GetDelegate();
// EventHandlerList eventHandlerList= GetEventHandlerList();
// eventHandlerList.RemoveHandler("EVENT_DATAGRIDVIEWSELECTIONCHANGED", selectionChanged);
dataGridView.SelectionChanged -= selectionChanged;
}
// DisablePrivateEvent();
}
/// <summary>
/// 开启一些界面显示影响的事件
/// </summary>
private void EnableEvents()
{
if (selectionChanged != null)
{
// GetDelegate();
// EventHandlerList eventHandlerList = GetEventHandlerList();
// eventHandlerList.AddHandler("EVENT_DATAGRIDVIEWSELECTIONCHANGED", selectionChanged);
dataGridView.SelectionChanged -= selectionChanged;
dataGridView.SelectionChanged += selectionChanged;
// 调用以下
// selectionChanged?.Invoke(dataGridView, new EventArgs());
}
// SetPrivateEvent();
}
/// <summary>
/// 自定义排序
/// </summary>
private void CustomSort(string columnBindingName, bool ascend)
{
ColumnSorting?.Invoke(columnBindingName, ascend);
// CommonGlobalUtil.Debug("排序开始:" + columnBindingName);
DisableEvents();
List<DataGridViewRow> rowHeaders = new List<DataGridViewRow>();
foreach (DataGridViewRow row in this.dataGridView.Rows)
{
if (!String.IsNullOrEmpty(ValidateUtil.CheckEmptyValue(row.HeaderCell.Value)) && IsUnSelectedableRow(row))
{
rowHeaders.Add(row);
}
}
if (DataSource is DataTable)
{
foreach (var item in rowHeaders)
{
dataGridView.Rows.Remove(item);
}
if (this.DataSource != null)
{
DataTable dt = this.DataSource as DataTable;
DataView dv = dt.DefaultView;
dv.Sort = columnBindingName + " " + (ascend ? "ASC" : "DESC");
this.DataSource = dv.ToTable();
//this.BindingDataSource();
}
}
else if (DataSource is IList)
{ //重新调用服务端查询
if (OrderPara != null)
{
//483 报表:所有报表都需要排序功能
//增加反序字段处理,通过cellFormat渲染显示的值,排序依照指定字段排序
if (columnBindingName.Contains("#Revert"))
{
OrderPara.Ascend = !ascend;
OrderPara.ColumnOrderby = columnBindingName.Substring(0, columnBindingName.IndexOf("#Revert"));
}
else
{
OrderPara.Ascend = ascend;
OrderPara.ColumnOrderby = columnBindingName;
}
if (isPaging)
{
PageControlPanel21_CurrentPageIndexChanged(0);
}
else
{
OrderSearch.Invoke(null, null);
}
}
}
EnableEvents();
// CommonGlobalUtil.Debug("排序结束:" + columnBindingName);
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
private void PageControlPanel21_CurrentPageIndexChanged(int obj)
{
///20180618,如果是分页刷新,总数还是有问题,总数只是在初始化查询给的,数据有变也获取
currentPageIndex = obj;
this.CurrentPageIndexChanged?.Invoke(obj);
}
/// <summary>
/// 分页查询时触发, 序号、总行数相关显示调用
/// </summary>
/// <param name="listPage"></param>
public void Initialize(BasePage listPage)
{
if (listPage != null)
{
UpdatePageCount(listPage.TotalEntityCount);
Initialize(pageCount);
}
else
{
Initialize(1);
}
}
public void Initialize(int index)
{
this.pageCount = index;
this.pageControlPanel21.Initialize(index);
this.currentPageIndex = 0;
}
private void UpdatePageCount(int totalEntityCount)
{
int pageCount = (int)Math.Ceiling((double)totalEntityCount / PageSize);
this.skinLabelTotalCount.Text = "共" + totalEntityCount + "行";
InitializePageControl(pageCount);
}
private void InitializePageControl(int pageCount)
{
this.pageCount = pageCount;
this.pageControlPanel21.Initialize(pageCount);
//必须指定跳转到指定页面,否则初始化会重置
pageControlPanel21.GotoPage(this.currentPageIndex, false);
// this.currentPageIndex = 0;
}
public void ClearSummary()
{
// DisableColumnsResizeEvent();
panel5.Visible = false;
summaryControlContainer1.Unable();
summaryControlContainer2.Unable();
// this.summaryControlContainer1.Visible = false;
// this.summaryControlContainer2.Visible = false;
// panel5.Controls.Remove(summaryControlContainer1);
// panel5.Controls.Remove(summaryControlContainer2);
// SetColumnsResizeEvent();
}
private void ShowSummary(DataRow dr, string[] columnDataPropertyNames)
{
if (dr != null)
{
panel5.Visible = true;
// summaryControlContainer2 = new SummaryControlContainer();
panel5.Controls.Add(summaryControlContainer2);
summaryControlContainer1.Dock = DockStyle.Top;
summaryControlContainer2.Init(dataGridView, "总计", dr, columnDataPropertyNames);
summaryControlContainer2.Visible = true;
}
}
public void ShowSummary<T>(DataGridView dataGridView, List<T> list, string[] columnDataPropertyNames)
{
// CommonGlobalUtil.Debug(" begin ShowSummary");
if (list != null && list.Count > 0)
{
panel5.Visible = true;
// summaryControlContainer1 = new SummaryControlContainer();
/**
* 这里会触发resize事件,name原来的尺寸会变,然后这个时候他也变了、多了这一行,会导致datagridview的高度变化
*
*
* */
panel5.Controls.Add(summaryControlContainer1);
summaryControlContainer1.Init(dataGridView, list.Count > 1 ? "小计" : "总计", list[0], columnDataPropertyNames);
summaryControlContainer1.Visible = true;
if (list.Count > 1)
{
// summaryControlContainer2 = new SummaryControlContainer();
panel5.Controls.Add(summaryControlContainer2);
summaryControlContainer1.Dock = DockStyle.Top;
summaryControlContainer2.Dock = DockStyle.Bottom;
summaryControlContainer2.Init(dataGridView, "总计", list[1], columnDataPropertyNames);
summaryControlContainer2.Visible = true;
}
}
// CommonGlobalUtil.Debug(" end ShowSummary");
}
public void BindingDataSource<T>(List<T> list, string[] columns, int? totalCount, T totalRow = default(T), bool[] abs4Column = null,bool isPaging = true) where T : class, new()
{
DisableEvents();
if (columns == null) {
if (ColumnDataPropertyNames != null) {
columns = ColumnDataPropertyNames;
}
}
int count = 0;
if (totalCount == null) {
count = 0;
}
else {
count =(int) totalCount;
}
UpdatePageCount(count);
DataGridViewHelper.BindSource4Reports<T>(this, dataGridView, list, columns, pageCount > 1 ? totalRow : null,abs4Column,isPaging);
EnableEvents();
}
//针对排序用,不支持分页
/// <summary>
/// DisableEvents 比如selectchange事件,必须设置否则会刷很多次
/// </summary>
/// <param name="dt"></param>
/// <param name="sortColumn"></param>
/// <param name="listSortDirection"></param>
///
//public void BindingDataSource<T>(DataTable dt, T totalRow = default(T))
//{
// BindingDataSource(dt,null, ListSortDirection.Descending, totalRow);
//}
public void BindingDataSource<T>(DataTable dt, DataGridViewColumn sortColumn = null, ListSortDirection listSortDirection = ListSortDirection.Descending, T totalRow = default(T))
{
// CommonGlobalUtil.Debug("开始绑定: BindingDataSource(DataTable dt, DataGridViewColumn sortColumn = null, ListSortDirection listSortDirection = ListSortDirection.Descending)");
DisableEvents();
DataRow dr = null;
this.dataGridView.AllowUserToOrderColumns = true;
foreach (DataGridViewColumn item in dataGridView.Columns)
{
if (item.SortMode != DataGridViewColumnSortMode.NotSortable)
{
//在点击列标题可作为判断是否排序
item.SortMode = DataGridViewColumnSortMode.Programmatic;
}
}
ClearSummary();
if (ColumnDataPropertyNames != null)
{
//小计
if (dt != null && dt.Rows.Count > 0)
{
// DataRow row = dt.NewRow();
// dt.Rows.Add(row);
this.DataSource = dt;
if (totalRow != null)
{
List<T> list = new List<T>();
list.Add(totalRow);
ShowSummary(dataGridView, list, ColumnDataPropertyNames);
}
else
{
dr = DataGridViewUtil.GetSumRow(dt, ColumnDataPropertyNames);
ShowSummary(dr, ColumnDataPropertyNames);
}
//DataGridViewCellStyle style = new DataGridViewCellStyle();
//style.Font = new Font(dataGridView.DefaultCellStyle.Font.Name, dataGridView.DefaultCellStyle.Font.Size, FontStyle.Bold);
//this.dataGridView.Rows[this.dataGridView.RowCount - 1].HeaderCell.Value = String.Empty;
//this.dataGridView.Rows[this.dataGridView.RowCount - 1].DefaultCellStyle = style;
//DataGridViewCellStyle emptyStyle = new DataGridViewCellStyle();
//emptyStyle.ForeColor = Color.Transparent;
//emptyStyle.SelectionForeColor = Color.Transparent;
// DataGridViewHelper.SetCellContentEmpty(this.dataGridView.Rows[this.dataGridView.RowCount - 1], new String[] { }, emptyStyle);
}
else
{
this.DataSource = null;
}
}
else
{
if (dt != null)
{
this.DataSource = null;
}
this.DataSource = dt;
}
if (sortColumn != null)
{
dataGridView1_ColumnHeaderMouseClick(dataGridView, new DataGridViewCellMouseEventArgs(sortColumn.Index, 0, 0, 0, new MouseEventArgs(new MouseButtons(), 0, 0, 0, 0)));
}
else
{
EnableEvents();
}
// CommonGlobalUtil.Debug("开始绑定: BindingDataSource(DataTable dt, DataGridViewColumn sortColumn = null, ListSortDirection listSortDirection = ListSortDirection.Descending)");
}
/// <summary>
/// 需要统计的时候调用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="pageSumEntity"></param>
/// <param name="toDataTable"></param>
public void BindingDataSource<T>(List<T> list, T totalRow = default(T), bool isPaging = true) where T : class, new()
{
DisableEvents();
T t = new T();
if (isPaging)
{
t = pageCount > 1 ? totalRow : null;
}
else
{
t = totalRow;
}
// DisableColumnsResizeEvent();
DataGridViewHelper.BindSource4Reports<T>(this, dataGridView, list, this.ColumnDataPropertyNames, t, isPaging);
// SetColumnsResizeEvent();
// SetStyle();
EnableEvents();
}
/// <summary>
/// 判断是否为统计行
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public bool IsUnSelectedableRow(DataGridViewRow row)
{
if (row != null)
{
return (ROW_HEADERS[0] == (row.HeaderCell.Value?.ToString())) || (ROW_HEADERS[1] == (row.HeaderCell.Value?.ToString()));
}
else { return false; }
}
public bool IsEmptyRowHeader(DataGridViewRow row)
{
if (row != null)
{
return (DataGridViewHelper.EMPTY_ROW_HEADER == (row.HeaderCell.Value?.ToString()));
}
else { return false; }
}
private void 复制CToolStripMenuItem_Click(object sender, EventArgs e)
{
Clipboard.SetDataObject(this.dataGridView.GetClipboardContent());
}
}
}