列表控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EfwControls.CustomControl
{
/// <summary>
/// 前景或背景
/// </summary>
public enum ForeOrBack
{
Fore,
Back
}

/// <summary>
/// 方向
/// </summary>
public enum Direction
{
LeftToRight,
TopToButtom,
}

public partial class DataGrid : DevComponents.DotNetBar.Controls.DataGridViewX
{
/// <summary>
/// 要画的线的信息列表
/// </summary>
private List<DataGridViewDrawLineInfo> lines;

/// <summary>
/// 是否允许点击ColumnHeader排序
/// </summary>
private bool allowSortWhenClickColumnHeader;
[Description("获取或设置是否允许点击ColumnHeader排序")]
public bool AllowSortWhenClickColumnHeader
{
get
{
return allowSortWhenClickColumnHeader;
}
set
{
allowSortWhenClickColumnHeader = value;
if (this.Columns != null)
{
for (int i = 0; i < this.Columns.Count; i++)
{
if (value == false)
this.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
else
this.Columns[i].SortMode = DataGridViewColumnSortMode.Automatic;
}
}
}
}

private bool _SeqVisible = true;
[Description("获取或设置是否显示序号")]
public bool SeqVisible
{
get { return _SeqVisible; }
set
{
_SeqVisible = value;
this.RowHeadersVisible = _SeqVisible;
}
}

public DataGrid()
{
InitializeComponent();
this.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(239)))), ((int)(((byte)(255)))));
this.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(239)))), ((int)(((byte)(255)))));
this.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
this.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
this.BorderStyle = BorderStyle.Fixed3D;
this.AutoGenerateColumns = false;
this.RowHeadersWidth = 25;
this.AllowUserToResizeRows = false;
this.HighlightSelectedColumnHeaders = false;
this.SelectAllSignVisible = false;
System.Windows.Forms.DataGridViewCellStyle cellstyle = new System.Windows.Forms.DataGridViewCellStyle();
cellstyle.BackColor = System.Drawing.Color.AliceBlue;
this.AlternatingRowsDefaultCellStyle = cellstyle;
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (lines != null)
{
foreach (DataGridViewDrawLineInfo line in lines)
{
float lineWidth = line.Width;
if (lineWidth == 0)
lineWidth = 1F;
Color lineColor = line.Color;
if (lineColor.IsEmpty)
lineColor = this.DefaultCellStyle.ForeColor;

if (line.DrawDirection == Direction.TopToButtom)
{
#region 上到下的线
Rectangle startRect = new Rectangle();
Rectangle endRect = new Rectangle();
try
{
startRect = this.GetCellDisplayRectangle(line.DrawLineOfRowColumnIndex, line.StartIndexOfRowColumn, true);
endRect = this.GetCellDisplayRectangle(line.DrawLineOfRowColumnIndex, line.EndIndexOfRowColumn, true);
}
catch
{
throw new Exception("索引超出数组界限,原因可能:要绘制的线条的目标行或列已经被移除!");
}
Point ptStart = new Point(startRect.Left + startRect.Width / 2, startRect.Top + startRect.Height / 2);
Point ptEnd = new Point(endRect.Left + endRect.Width / 2, endRect.Bottom - endRect.Height / 2);

Point ptStart_1 = new Point(ptStart.X + this.Columns[line.DrawLineOfRowColumnIndex].Width / 2, ptStart.Y);
Point ptEnd_1 = new Point(ptEnd.X + this.Columns[line.DrawLineOfRowColumnIndex].Width / 2, ptEnd.Y);

if (ptStart.X == 0 && ptStart.Y == 0 && ptEnd.X == 0 && ptEnd.Y == 0)
continue;

if (ptStart.X == 0 && ptStart.Y == 0)
{
ptStart.X = ptEnd.X;
ptStart.Y = this.ColumnHeadersHeight;
ptStart_1.X = 0;
ptStart_1.Y = 0;

}
if (ptEnd.X == 0 && ptEnd.Y == 0)
{
ptEnd.X = ptStart.X;
ptEnd.Y = this.Height;
ptEnd_1.X = 0;
ptEnd_1.Y = 0;
}

Pen pen = new Pen(lineColor, lineWidth);
//开始端的横线
if (ptStart_1.X != 0 && ptStart_1.Y != 0)
e.Graphics.DrawLine(pen, ptStart, ptStart_1);
//竖线主体
e.Graphics.DrawLine(pen, ptStart, ptEnd);
//结束端的横线
if (ptEnd_1.X != 0 && ptEnd.Y != 0)
e.Graphics.DrawLine(pen, ptEnd, ptEnd_1);
#endregion
}
else
{
#region 左到右
Rectangle startRect = new Rectangle();
Rectangle endRect = new Rectangle();
try
{
startRect = this.GetCellDisplayRectangle(line.StartIndexOfRowColumn, line.DrawLineOfRowColumnIndex, true);
endRect = this.GetCellDisplayRectangle(line.EndIndexOfRowColumn, line.DrawLineOfRowColumnIndex, true);
}
catch
{
throw new Exception("索引超出数组界限,原因可能:要绘制的线条的目标行或列已经被移除!");
}

Point ptStart = new Point(startRect.Left, startRect.Top + startRect.Height / 2);
Point ptEnd = new Point(endRect.Left + endRect.Width, endRect.Top + endRect.Height / 2);

if (ptStart.X == 0 && ptStart.Y == 0 && ptEnd.X == 0 && ptEnd.Y == 0)
continue;

if (ptStart.X == 0 && ptStart.Y == 0)
{
ptStart.X = ptStart.X = this.RowHeadersWidth;
}
if (ptEnd.X == 0 && ptEnd.Y == 0)
{
ptEnd.X = this.Width;

}
Pen pen = new Pen(lineColor, lineWidth);

e.Graphics.DrawLine(pen, ptStart, ptEnd);

#endregion
}
}
}
}

protected override void OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)
{
if (RowHeadersVisible)
{
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, RowHeadersWidth - 4, e.RowBounds.Height);
System.Windows.Forms.TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),
RowHeadersDefaultCellStyle.Font, rectangle, RowHeadersDefaultCellStyle.ForeColor, System.Windows.Forms.TextFormatFlags.VerticalCenter | System.Windows.Forms.TextFormatFlags.HorizontalCenter);
}
base.OnRowPostPaint(e);
}

protected override void OnColumnAdded(DataGridViewColumnEventArgs e)
{
if (allowSortWhenClickColumnHeader)
e.Column.SortMode = DataGridViewColumnSortMode.Automatic;
else
e.Column.SortMode = DataGridViewColumnSortMode.NotSortable;
base.OnColumnAdded(e);
}

protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
HitTestInfo htInfo = this.HitTest(e.X, e.Y);
if (htInfo.Type == DataGridViewHitTestType.Cell)
{
if (htInfo.ColumnIndex != -1 && htInfo.RowIndex != -1)
this.CurrentCell = this[htInfo.ColumnIndex, htInfo.RowIndex];
}
else if (htInfo.Type == DataGridViewHitTestType.ColumnHeader)
{
if (this.Rows.Count > 0)
{
int rowIndex = 0;
while (true)
{
if (this.Rows[rowIndex].Visible)
break;
else
rowIndex++;
}
this.CurrentCell = this[htInfo.ColumnIndex, rowIndex];
}
}
else if (htInfo.Type == DataGridViewHitTestType.RowHeader)
{
int columnIndex = 0;
while (true)
{
if (this.Columns[columnIndex].Visible)
break;
else
columnIndex++;
}
this.CurrentCell = this[columnIndex, htInfo.RowIndex];
}
}

/// <summary>
/// 在指定的位置划线
/// </summary>
/// <param name="StartIndex">开始行或列</param>
/// <param name="EndIndex">结束行或列</param>
/// <param name="RowOrColumnIndex">行或列</param>
/// <param name="direct">方向</param>
public void DrawLines(List<DataGridViewDrawLineInfo> Lines)
{
lines = Lines;
this.InvokePaint(this, new PaintEventArgs(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height)));
}
/// <summary>
/// 增加一个线条对象
/// </summary>
/// <param name="Line"></param>
public void AddLine(DataGridViewDrawLineInfo Line)
{
if (lines == null)
lines = new List<DataGridViewDrawLineInfo>();
lines.Add(Line);
this.InvokePaint(this, new PaintEventArgs(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height)));
}
/// <summary>
/// 移除一个线条对象
/// </summary>
/// <param name="Line"></param>
public void RemoveLine(DataGridViewDrawLineInfo Line)
{
if (lines != null)
{
DataGridViewDrawLineInfo needRemoveLine = null;
foreach (DataGridViewDrawLineInfo line in lines)
{
if (line.StartIndexOfRowColumn == Line.StartIndexOfRowColumn && line.EndIndexOfRowColumn == Line.EndIndexOfRowColumn
&& line.DrawLineOfRowColumnIndex == Line.DrawLineOfRowColumnIndex && line.DrawDirection == Line.DrawDirection)
{
needRemoveLine = line;
break;
}
}
if (needRemoveLine != null)
{
lines.Remove(needRemoveLine);
this.InvokePaint(this, new PaintEventArgs(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height)));
}
}
}
/// <summary>
/// 清除所有线条
/// </summary>
public void ClearLines()
{
lines = null;
this.InvokePaint(this, new PaintEventArgs(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height)));
}
/// <summary>
/// 设置行颜色
/// </summary>
/// <param name="forceColor">前景色</param>
/// <param name="BackColor">背景色</param>
public void SetRowColor(int RowIndex, Color foreColor, Color backColor)
{
for (int ColIndex = 0; ColIndex < this.Columns.Count; ColIndex++)
{
//this.Rows[RowIndex].DefaultCellStyle
this[ColIndex, RowIndex].Style.ForeColor = foreColor;
this[ColIndex, RowIndex].Style.BackColor = backColor;

}
}
/// <summary>
/// 设置行颜色
/// </summary>
/// <param name="forceColor">前景色或者背景色</param>
/// <param name="forceColor">指示是否是前景色</param>
public void SetRowColor(int RowIndex, Color color, bool IsforceColor)
{
for (int ColIndex = 0; ColIndex < this.Columns.Count; ColIndex++)
{
if (IsforceColor)
this[ColIndex, RowIndex].Style.ForeColor = color;
else
this[ColIndex, RowIndex].Style.BackColor = color;

}
}
/// <summary>
/// 设置行颜色
/// </summary>
/// <param name="forceColor">前景色</param>
/// <param name="BackColor">背景色</param>
public void SetRowColor(int RowIndex, Color color, ForeOrBack foreOrBack)
{
for (int ColIndex = 0; ColIndex < this.Columns.Count; ColIndex++)
{
if (foreOrBack == ForeOrBack.Fore)
this[ColIndex, RowIndex].Style.ForeColor = color;
else
this[ColIndex, RowIndex].Style.BackColor = color;
}
}
}

/// <summary>
/// 网格画线所需的信息
/// </summary>
public class DataGridViewDrawLineInfo
{
/// <summary>
/// 待画线的开始行(列)的索引
/// </summary>
private int startIndexOfRowColumn;
/// <summary>
/// 带画线的结束行(列)的索引
/// </summary>
private int endIndexOfRowColumn;
/// <summary>
/// 需要画线的行(列)索引
/// </summary>
private int drawLineOfRowColumnIndex;
/// <summary>
/// 画线的方向(自左到右 或者 自上到下)
/// </summary>
private Direction drawDirection;
/// <summary>
/// 线条编号
/// </summary>
private int index;
/// <summary>
/// 线条颜色
/// </summary>
private Color color;
/// <summary>
/// 线条宽度
/// </summary>
private float width;

/// <summary>
/// 待画线的开始行(列)的索引
/// </summary>
public int StartIndexOfRowColumn
{
get
{
return startIndexOfRowColumn;
}
set
{
startIndexOfRowColumn = value;
}
}
/// <summary>
/// 带画线的结束行(列)的索引
/// </summary>
public int EndIndexOfRowColumn
{
get
{
return endIndexOfRowColumn;
}
set
{
endIndexOfRowColumn = value;
}
}
/// <summary>
/// 需要画线的行(列)索引
/// </summary>
public int DrawLineOfRowColumnIndex
{
get
{
return drawLineOfRowColumnIndex;
}
set
{
drawLineOfRowColumnIndex = value;
}
}
/// <summary>
/// 画线的方向(自左到右 或者 自上到下)
/// </summary>
public Direction DrawDirection
{
get
{
return drawDirection;
}
set
{
drawDirection = value;
}
}
/// <summary>
/// 线条编号
/// </summary>
public int Index
{
get
{
return index;
}
}
/// <summary>
/// 线条颜色
/// </summary>
public Color Color
{
get
{
return color;
}
set
{
color = value;
}
}
/// <summary>
/// 线条宽度
/// </summary>
public float Width
{
get
{
return width;
}
set
{
width = value;
}
}
}
}

时间: 2024-10-10 17:26:56

列表控件的相关文章

如何控制通达OA的工作流表单列表控件的列输入框

通达OA的工作流表单列表控件只提供了从内部或外部数据源映射选择,但有时需要控制某些列不能输入,有些列录入后,带出其他列的数据,如下图 //通过存货编号取存货信息 function getinventory(cinvcode){ var resobj; jQuery.ajax({type:'POST', url:'/userext/index.php?c=workflow&m=getcinvname', data:{cinvcode:cinvcode}, success:function(res)

iOS开发--自定义列表控件

这两天项目比较闲,在空余之际,尝试自己实现列表控件.从动工到初步完成大概花了一天时间,目前实现了列表的简单功能,后续将考虑加入cell重用机制.惯性特征以及删除cell等功能.项目代码已经放到了github上,地址:https://github.com/wanglichun/CustomTableView. 在实现之前,需要了解列表控件的运行原理,我之前的一篇博客<列表控件实现原理解析>中有介绍.去年由于项目需要,使用lua语言自定义过双重列表(大列表嵌套小列表),这次改用objc实现,实现的

MFC可视化 列表控件的使用

1.应该加入头文件 #include <Atlbase.h> 2.示例 类向导给列表控件绑定变量m_list DWORD   dwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_FLATSB; m_list.ModifyStyle(0,LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS);m_list.SetEx

UWP开发必备:常用数据列表控件汇总比较

今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据项的水平网格控件 ListView:用于显示数据项的垂直列表控件 ListBox:可选项列表控件 ItemsControl:用于显示数据项的列表控件.是其他控件的父类. Pivot:应用内部标签导航控件 FlipView:每次只显示一个数据项的控件,通过滑动切换数据项 SplitView:包含主视图

WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: DataGrid自定义样式: ListView自定义样式: 二.DataGrid自定义样式 DataGrid是常用的数据列表显示控件,先看看实现的效果(动态图,有点大): DataGrid控件样式结构包括以下几个部分: 列头header样式 调整列头宽度的列分割线样式 行样式 行头调整高度样式 行头部样式

列表控件ListBox关联的MFC中的类:CListBox

######################################################## 1.在列表的结尾添加一项:AddString 2.在列表的指定位置添加一项:InsertString 3.获取列表中项的个数:GetCount 4.获取某项的文本:GetText 5.在单选列表控件中,获取与设置当前选中项:GetCurSel.SetCurSel 6.在列表项中查找指定的字符串:FindString.FindStringExact 7.删除列表中所有的项:ResetC

Android ListView列表控件的简单使用

ListView 列表是我们经常会使用的控件, 如果想要自定义里面的显示的话是挺麻烦的, 需要新建XML.Class SimpleAdapter这两个文件, 较为麻烦. 如果我们只是想显示两.三行文字在上面, 却又不想那么麻烦呢? 那我们只要新建一个XML就够了.  这里以显示一个ListView项里三个TextView为例.  首先我们要创建一个XML文件, 这个XML文件是用来作为单个ListView项布局用的.  list_row.xml[java]<?xml version="1.

图像列表控件

通过Create方法创建一个图像列表 m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,0); 通过图像列表控件,可以直接将控件中的图像绘制到程序中.首先调用Create方法创建一个图像列表,然后调用Add方法向图像列表控件中添加图像. 最后调用Draw方法将图像列表中的图像绘制在指定的画布上. CImageList m_ImageList; m_ImageList.Create(IDB_BITMAP1,216,0,ILC_COLOR16|ILC_M

虚拟列表控件---加载大数据行

虚拟列表控件---加载大数据行 平常所用到的列ListView/ListCtrl控件,都是只有行至几百行数据,直至今日,在项目中遇到了上10W量级数据条,终于感觉到普通加载的艰辛,遂到网上乱找一通,发现大同小异,转载了这篇比较详细的,后面代码所用到的m_Items,为存放的列表的数据结构列表, 这篇文章虽详尽,改日做一个DEMO, Demo 一.什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件.. 二.为什么使用虚拟列表控件 我们知道,通常使用列表控件CListC

Android自定义标签列表控件LabelsView解析

版权声明:本文为博主原创文章,未经博主允许不得转载. 无论是在移动端的App,还是在前端的网页,我们经常会看到下面这种标签的列表效果:   标签从左到右摆放,一行显示不下时自动换行.这样的效果用Android源生的控件很不好实现,所以往往需要我们自己去自定义控件.我在开发中就遇到过几次要实现这样的标签列表效果,所以就自己写了个控件,放到我的GitHub,方便以后使用.有兴趣的同学也欢迎访问我的GitHub.查看源码实现和使用该控件.下面我将为大家介绍该控件的具体实现和使用. 要实现这样一个标签列