using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using UAS_PLCDataReader.Entity;
namespace UAS_PLCDataReader.CustomerControl.GridViewWithSerialNum
{
public partial class GridViewWithSerialNum : GridView
{
private Rectangle checkBoxColumnHeaderRect = Rectangle.Empty;
private GridColumn checkBoxColumn = null;
public GridViewWithSerialNum()
{
InitializeComponent();
IndicatorWidth = 30;
}
///
/// 绘制行号
///
///
///
private void GridViewWithSerialNum_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e)
{
if (e.Info.IsRowIndicator && e.RowHandle >= 0)
{
e.Info.DisplayText = (e.RowHandle + 1).ToString();
}
}
///
/// 绘制指定的列头的CheckBox
///
///
///
private void GridViewWithSerialNum_CustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e)
{
if (e.Column != null && e.Column.FieldName == SystemInf.CheckedColumnName)
{
checkBoxColumnHeaderRect = e.Bounds;
checkBoxColumn = e.Column;
e.Column.Caption = " ";
//须把列头标题设置为空
e.Painter.DrawObject(e.Info);
//在列头中心显示复选框
int x = e.Bounds.X + (int)((e.Bounds.Width - CheckBoxRenderer.GetGlyphSize(e.Graphics, CheckBoxState.UncheckedNormal).Width) * 0.5);
int y = e.Bounds.Y + (int)((e.Bounds.Height - CheckBoxRenderer.GetGlyphSize(e.Graphics, CheckBoxState.UncheckedNormal).Height) * 0.5);
Point location = new Point(x, y);
CheckBoxState checkBoxState;
if (e.Column.Tag != null && e.Column.Tag.ToString() == "1")
checkBoxState = CheckBoxState.CheckedPressed;
else
checkBoxState = CheckBoxState.UncheckedNormal;
CheckBoxRenderer.DrawCheckBox(e.Graphics, location, checkBoxState);
e.Handled = true;
}
}
///
/// 执行全部勾选或者全部不勾选
///
///
///
private void GridViewWithSerialNum_MouseDown(object sender, MouseEventArgs e)
{
SyncCheckStatus(this, SystemInf.CheckedColumnName, e);
}
///
/// 绘制列头的CheckBox
///
///
///
private void GridViewWithSerialNum_MouseUp(object sender, MouseEventArgs e)
{
if (checkBoxColumnHeaderRect != Rectangle.Empty)
{
if (e.X > checkBoxColumnHeaderRect.X && e.X < (checkBoxColumnHeaderRect.X + checkBoxColumnHeaderRect.Width) && e.Y > checkBoxColumnHeaderRect.Y && e.Y < (checkBoxColumnHeaderRect.Y + checkBoxColumnHeaderRect.Height))
{
if (checkBoxColumn.Tag != null && checkBoxColumn.Tag.ToString() == "1" && CheckRowCount == RowCount)
checkBoxColumn.Tag = "0";
//在这写未全选逻辑
else
checkBoxColumn.Tag = "1";
//在这写全选逻辑
//InvalidateColumnHeader(checkBoxColumn);
}
}
}
///
/// GridViewWithSerialNum_MouseUp事件最后执行,提前记录勾选的行号,防止后面统计错误
///
static int CheckRowCount;
public static void SyncCheckStatus(GridView view, string fieldeName, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
view.ClearSorting();
view.PostEditor();
GridHitInfo _info;
Point _pt = view.GridControl.PointToClient(Control.MousePosition);
_info = view.CalcHitInfo(_pt);
if (_info.InColumn && _info.Column.FieldName.Equals(fieldeName))
{
CheckRowCount = getCheckedCount(view, fieldeName);
if (CheckRowCount == view.DataRowCount)
UnChekAll(view, fieldeName);
else
CheckAll(view, fieldeName);
}
}
}
///
/// 通过勾选的行数和总行数来判断下一次点击是否全部勾选
///
///
///
///
private static int getCheckedCount(GridView view, string filedName)
{
int count = 0;
for (int i = 0; i < view.DataRowCount; i++)
{
object _cellValue = view.GetRowCellValue(i, view.Columns[filedName]);
if (_cellValue == null) continue;
if (string.IsNullOrEmpty(_cellValue.ToString().Trim())) continue;
bool _checkStatus = false;
if (bool.TryParse(_cellValue.ToString() == "0" ? "false" : "true", out _checkStatus))
{
if (_checkStatus)
count++;
}
}
return count;
}
///
/// 设置全选
///
///
///
private static void CheckAll(GridView view, string fieldName)
{
for (int i = 0; i < view.DataRowCount; i++)
{
view.SetRowCellValue(i, fieldName, true);
}
}
///
/// 设置全部不选
///
///
///
private static void UnChekAll(GridView view, string fieldName)
{
for (int i = 0; i < view.DataRowCount; i++)
{
view.SetRowCellValue(i, fieldName, false);
}
}
}
}