winform DataGridView-----2
上一篇对Data'gridView做了简单的封装,基本能满足正常开发了,后来我发现一个单元中同时会又左边图标右边文字的情况,这次就把这个也加上。所以我自定义歌一个组件。
自定义 DataGridView 组件:
public partial class GridList : DataGridView
{
private Dictionary<int, Image> dic { get; set; }
public void SetHeader(List<dataGridViewModel> viewModel)
{
dic = new Dictionary<int, Image>();
this.CellFormatting += Grid_cellFormartting;
foreach (var item in viewModel)
{
switch (item.colType)
{
case ColType.文本:
this.AutoGenerateColumns = false;
TextAndImageColumn ColumnRoleID = new TextAndImageColumn();
ColumnRoleID.DataPropertyName = item.colName;
ColumnRoleID.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
ColumnRoleID.Name = item.colName;
ColumnRoleID.HeaderText = item.colTitle;
this.Columns.Add(ColumnRoleID);
break;
case ColType.图标://单独一列显示图标
this.SetImage();
break;
case ColType.图标文本://单独一列显示图标
SetCellImgOrText(item.cell);
break;
case ColType.按钮:
this.SetButton(item.TitleData);
break;
default:
break;
}
}
}
/// <summary>
/// 设置图标文字
/// </summary>
/// <param name="cellType"></param>
private void SetCellImgOrText(CellType cellType)
{
dic.Add(cellType.ColIndex, cellType.ImageType);
}
/// <summary>
/// 列表添加图片
/// </summary>
private void SetImage()
{
DataGridViewImageColumn Imange = new DataGridViewImageColumn();
Imange.ImageLayout = DataGridViewImageCellLayout.Zoom;
// Imange.HeaderText = "图标";
this.Columns.Add(Imange);
}
/// <summary>
/// 列表添加操作按钮
/// </summary>
/// <param name="gridView"></param>
public void SetButton( Title title)
{
if (title == null)
{
return;
}
DataGridViewButtonColumn select = new DataGridViewButtonColumn
{
Name = title.headTitle,
Text = title.Text,
UseColumnTextForButtonValue = true,
DataPropertyName = "operate",
FillWeight = 5,
HeaderText = title.headText
};
select.FlatStyle = FlatStyle.Flat;
select.Width = 20;
select.DefaultCellStyle.ForeColor = string.IsNullOrEmpty(title.color) ? Color.Black : colorHx16toRGB(title.color);
this.Columns.Add(select);
}
/// <summary>
/// 设置隐藏某一列
/// </summary>
/// <param name="gridView"></param>
/// <param name="colVisible"></param>
public void SetColVisible( string[] colVisible)
{
for (int i = 0; i < colVisible.Length; i++)
{
this.Columns[colVisible[i]].Visible = false;
}
}
/// <summary>
/// 对某些列进行列宽设置
/// </summary>
/// <param name="gridView"></param>
/// <param name="colWidth"></param>
public void SetColWidth(Dictionary<int, int> colWidth)
{
foreach (int key in colWidth.Keys)
{
this.Columns[key].Width = colWidth[key];
}
}
/// <summary>
/// 表头颜色设置
/// </summary>
public void SetHeadColor( string color)
{
//设置行表头的颜色
this.EnableHeadersVisualStyles = false;
this.ColumnHeadersDefaultCellStyle.BackColor = colorHx16toRGB(color);
}
/// <summary>
/// 表头颜色设置
/// </summary>
public void SetHeadColor(int R, int G, int B)
{
//设置行表头的颜色
this.EnableHeadersVisualStyles = false;
this.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(R, G, B);
}
/// <summary>
/// 设置表头文字颜色
/// </summary>
public void SetHeadFontColor( int R, int G, int B)
{
//表头文字颜色
this.ColumnHeadersDefaultCellStyle.ForeColor = Color.FromArgb(R, G, B);
}
/// <summary>
/// 设置文字类型
/// </summary>
/// <param name="gridView"></param>
/// <param name="fontType"></param>
public void SetHeadFontType( Font fontType)
{
//行表头文字类型
this.ColumnHeadersDefaultCellStyle.Font = fontType;
}
/// <summary>
/// 设置表头行高0
/// </summary>
/// <param name="gridView"></param>
/// <param name="rowHeight"></param>
public void SetHeadRowHeight( int rowHeight)
{
//改变标题的行高
this.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
this.ColumnHeadersHeight = rowHeight;
}
/// <summary>
/// 居中标题
/// </summary>
public void SetHeadCenter()
{
this.AutoSize = false;
//标题居中
this.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
}
/// <summary>
/// 去除第一列空列
/// </summary>
public void SetRowHeadersVisible()
{
this.RowHeadersVisible = false;
}
/// <summary>
/// 去除最后一行空行
/// </summary>
public void SetAllowUserToAddRows()
{
this.AllowUserToAddRows = false;
}
public void SetCellRowFull()
{
this.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
public GridList()
{
InitializeComponent();
}
private void Grid_cellFormartting(object sender, DataGridViewCellFormattingEventArgs e)
{
foreach (int key in dic.Keys)
{
if (e.ColumnIndex==key)
{
TextAndImageCell cell = this.Rows[e.RowIndex].Cells[e.ColumnIndex] as TextAndImageCell;
if (cell != null && e.Value != null)
{
try
{
cell.Image = dic[key];
}
catch (Exception ex)
{
}
}
}
}
}
public GridList(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public Color colorHx16toRGB(string strHxColor)
{
try
{
if (strHxColor.Length == 0)
{//如果为空
return Color.FromArgb(0, 0, 0);//设为黑色
}
else
{//转换颜色
return Color.FromArgb(System.Int32.Parse(strHxColor.Substring(1, 2), System.Globalization.NumberStyles.AllowHexSpecifier), System.Int32.Parse(strHxColor.Substring(3, 2), System.Globalization.NumberStyles.AllowHexSpecifier), System.Int32.Parse(strHxColor.Substring(5, 2), System.Globalization.NumberStyles.AllowHexSpecifier));
}
}
catch
{//设为黑色
return Color.FromArgb(0, 0, 0);
}
}
}
public class TextAndImageColumn : DataGridViewTextBoxColumn
{
private Image imageValue;
private Size imageSize;
public TextAndImageColumn()
{
this.CellTemplate = new TextAndImageCell();
}
public override object Clone()
{
TextAndImageColumn c = base.Clone() as TextAndImageColumn;
c.imageValue = this.imageValue;
c.imageSize = this.imageSize;
return c;
}
public Image Image
{
get { return this.imageValue; }
set
{
if (this.Image != value)
{
this.imageValue = value;
this.imageSize = value.Size;
if (this.InheritedStyle != null)
{
Padding inheritedPadding = this.InheritedStyle.Padding;
this.DefaultCellStyle.Padding = new Padding(imageSize.Width,
inheritedPadding.Top, inheritedPadding.Right,
inheritedPadding.Bottom);
}
}
}
}
private TextAndImageCell TextAndImageCellTemplate
{
get { return this.CellTemplate as TextAndImageCell; }
}
internal Size ImageSize
{
get { return imageSize; }
}
}
public class TextAndImageCell : DataGridViewTextBoxCell
{
private Image imageValue;
private Size imageSize;
public override object Clone()
{
TextAndImageCell c = base.Clone() as TextAndImageCell;
c.imageValue = this.imageValue;
c.imageSize = this.imageSize;
return c;
}
public Image Image
{
get
{
if (this.OwningColumn == null ||
this.OwningTextAndImageColumn == null)
{
return imageValue;
}
else if (this.imageValue != null)
{
return this.imageValue;
}
else
{
return this.OwningTextAndImageColumn.Image;
}
}
set
{
if (this.imageValue != value)
{
this.imageValue = value;
this.imageSize = value.Size;
Padding inheritedPadding = this.InheritedStyle.Padding;
this.Style.Padding = new Padding(imageSize.Width,
inheritedPadding.Top, inheritedPadding.Right,
inheritedPadding.Bottom);
}
}
}
protected override void Paint(Graphics graphics, Rectangle clipBounds,
Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState,
object value, object formattedValue, string errorText,
DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts)
{
// Paint the base content
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
value, formattedValue, errorText, cellStyle,
advancedBorderStyle, paintParts);
if (this.Image != null)
{
// Draw the image clipped to the cell.
System.Drawing.Drawing2D.GraphicsContainer container =
graphics.BeginContainer();
graphics.SetClip(cellBounds);
graphics.DrawImageUnscaled(this.Image, cellBounds.Location);
graphics.EndContainer(container);
}
}
private TextAndImageColumn OwningTextAndImageColumn
{
get { return this.OwningColumn as TextAndImageColumn; }
}
}
Model:
public enum ColType
{
文本,
图标,
图标文本,
按钮
}
public class dataGridViewModel
{
public string colName { get; set; }
public string colTitle { get; set; }
public ColType colType { get; set; }
public Title TitleData { get; set; }
public CellType cell { get; set; }
}
/// <summary>
/// 图标,文字
/// </summary>
public class CellType
{
public int ColIndex { get; set; }
public Image ImageType { get; set; }
}
/// <summary>
/// 按钮
/// </summary>
public class Title
{
public string headTitle { get; set; }
public string Text { get; set; }
public string headText { get; set; }
public string color { get; set; }
}
实现:
从心编译工程,工具箱中会出现自定义控件:

//设置行表头的颜色
//dataGridView_Mark.SetHeadColor("#F5F5F5");
gridList1.SetHeadColor(250, 250, 250);
//表头文字颜色
// dataGridView_File2.SetHeadFontColor("#F5F5F5");
gridList1.SetHeadFontColor(95, 95, 95);
//行表头文字类型
gridList1.SetHeadFontType(new Font("楷体", 8, FontStyle.Bold));
//改变标题的行高
gridList1.SetHeadRowHeight(30);
//去除第一列空列
gridList1.SetRowHeadersVisible();
//行占满
gridList1.SetCellRowFull();
//去除最后一行空行
gridList1.SetAllowUserToAddRows();
//标题居中
gridList1.SetHeadCenter();
List<dataGridViewModel> viewModel = new List<dataGridViewModel>()
{
new dataGridViewModel(){colType=ColType.图标},
new dataGridViewModel(){colName="title",colTitle="标题",colType=ColType.图标文本,cell= new CellType(){ColIndex=2,ImageType=Properties.Resources.excel } },
new dataGridViewModel(){colName="title1",colTitle="标题",colType=ColType.文本},
new dataGridViewModel(){colName="title2",colTitle="标题",colType=ColType.文本},
new dataGridViewModel(){colName="title3",colTitle="标题",colType=ColType.文本},
new dataGridViewModel(){colName="title4",colTitle="标题",colType=ColType.文本},
new dataGridViewModel(){colName="title5",colTitle="标题",colType=ColType.文本},
new dataGridViewModel(){ colType = ColType.按钮,TitleData=new Title(){ headTitle="btnfile4",Text="按钮",headText="操作" } },
};
gridList1.SetHeader(viewModel);
//设置某列隐藏
// dataGridView_ReportList.SetColVisible(new string[] { "PKID", "customer" });
Dictionary<int, int> colWidth = new Dictionary<int, int>()
{
[0] = 30,
[6] = 60,
};
////设置列宽
gridList1.SetColWidth(colWidth);
for (int i = 0; i < 30; i++)
{
gridList1.Rows.Add(Properties.Resources.excel, "dsf", "dfsfs", "dsfsdf", "dfsf", "dfsf", "dfsfs");
}
效果:

项目中的效果图:

.Net Core

浙公网安备 33010602011771号