1. 特性: 使用特性定制表格(DataGridView)

本文介绍了一种利用.NET特性来配置DataGridView控件的方法。通过定义自定义特性并在实体类属性上应用这些特性,可以自动设置DataGridView列的显示属性,包括可见性、只读状态、宽度等。此外,还提供了一个辅助类用于从实体类属性中读取这些特性信息,并构建相应的DataGridViewTextBoxColumn对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、构建特性类:
using System; namespace AttributeDemo { //特性应用在属性上,不允许多行 [AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)] public class ColumnAttribute : Attribute { public ColumnAttribute(bool visible, bool readOnly, int width) { this.visible = visible; this.readOnly = readOnly; this.width = width; } private bool visible; public bool Visible { get { return visible; } } private bool readOnly; public bool ReadOnly { get { return readOnly; } } private int width; public int Width { get { return width; } } public string HeaderText { get; set; } //标记为DataGridView中是否含有此栏目 public bool IsNotShow { get; set; } //显示格式 public string Format { get; set; } //DataGridViewTextBoxColumn的最新宽度必须是2 private int? mininumWidth; public int MininumWidth { get { int length = mininumWidth == null ? 0 : (int)mininumWidth; length = length < 2 ? 2 : length; return length; } set { mininumWidth = value; } } } }

二、使用特性类

using System; using System.Windows.Forms; namespace AttributeDemo { public class Student { //DataGridView包含此栏目,但不显示 [Column(false, true, 80, HeaderText = "学号")] public string StudentNo { get; set; } [Column(true, false, 80, HeaderText="姓名")] public string Name { get; set; } [Column(true, true, 120, HeaderText = "出生日期", Format="yyyy年MM月dd日")] public DateTime BornDate { get; set; } [Column(true, true, 100, HeaderText = "电话")] public string Telephone { get; set; } //DataGridView不包含此栏目 [Column(true, true, 120, IsNotShow=true )] public string Memo { get; set; } public static DataGridViewTextBoxColumn[] GetColumns() { ColumnHelper columnHelper = new ColumnHelper(); return columnHelper.GetColumnArray(typeof(Student)); } } }

三、从实体类的属性的特性中读取栏目DataGridViewTextBoxColumn信息

using System; using System.Collections.Generic; using System.Windows.Forms; using System.Reflection; namespace AttributeDemo { public class ColumnHelper { public DataGridViewTextBoxColumn[] GetColumnArray(Type t) { List<DataGridViewTextBoxColumn> list = new List<DataGridViewTextBoxColumn>(); foreach (PropertyInfo info in t.GetProperties()) { ColumnAttribute columnAttribute = info.GetCustomAttributes(false)[0] as ColumnAttribute; DataGridViewTextBoxColumn column = GetColumn(info.Name, columnAttribute); if(column != null) list.Add(column); } return list.ToArray(); } private DataGridViewTextBoxColumn GetColumn(string columnName, ColumnAttribute columnAttribute) { if (columnAttribute.IsNotShow) return null; DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn(); column.Name = columnName; column.DataPropertyName = columnName; column.Visible = columnAttribute.Visible; column.ReadOnly = columnAttribute.ReadOnly; column.Width = columnAttribute.Width; column.HeaderText = columnAttribute.HeaderText; column.DefaultCellStyle.Format = columnAttribute.Format; column.MinimumWidth = columnAttribute.MininumWidth; return column; } } }

四、构造数据

using System; using System.Collections.Generic; namespace AttributeDemo { public class DataInfo { public List<Student> GetStudent() { List<Student> list = new List<Student>(); list.Add(new Student() { StudentNo = "0001", Name = "张三", BornDate = DateTime.Now.AddYears(-20), Telephone = "66666666", Memo = "测试一" }); list.Add(new Student() { StudentNo = "0002", Name = "李四", BornDate = DateTime.Now.AddYears(-19), Telephone = "88888888", Memo = "测试二" }); return list; } } }

五、使用就相当简单,在窗体上拖一个DataGridView控件。

using System; using System.Collections.Generic; using System.Windows.Forms; namespace AttributeDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitColumn(); } private void InitColumn() { this.dataGridView1.AutoGenerateColumns = false; DataGridViewTextBoxColumn[] columnArray = Student.GetColumns(); this.dataGridView1.Columns.AddRange(columnArray); } private void Form1_Load(object sender, EventArgs e) { DataInfo dataInfo = new DataInfo(); List<Student> list = dataInfo.GetStudent(); this.dataGridView1.DataSource = list; } } }

运行效果:

运行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值