通过反射快速实现DataGridView数据的添加,获取及序列化

来源:互联网 发布:网络设计方案ppt 编辑:程序博客网 时间:2024/06/05 10:36

最近手上没有新项目,比较清闲,特地去研究一下经常使用的DataGridView控件,希望能快速实现数据的存储,以下是一些学习心得,仅作为备忘录以及提供给有兴趣的同行一个参考,同时希望各位大神能指出不足和改进的地方。

1.首先创建一个基本数据类

[Serializable]    public class ItemBase    {        public bool Data1 { get; set; }        public string Data2 { get; set; }        public short Data3 { get; set; }        public int Data4 { get; set; }        public float Data5 { get; set; }        public double Data6 { get; set; }    }

2.创建数据集合类并继承 ISerializable 接口

[Serializable]    public class DataHub : ISerializable    {        private List<ItemBase> _items;        public List <ItemBase > Items        {            get { return _items; }            set { _items = value; }        }        public DataHub ()        {            _items = new List<ItemBase>();        }        private DataHub(SerializationInfo info, StreamingContext ctxt)        {            SerializationInfoEnumerator irator = info.GetEnumerator();            while (irator.MoveNext())            {                ItemBase item = new ItemBase();                PropertyInfo[] infos = item.GetType().GetProperties();                foreach (PropertyInfo pi in infos)                {                    pi.SetValue(item, info.GetValue(pi.Name, pi.GetType()), null);                }                _items.Add(item);            }        }        public void GetObjectData(SerializationInfo info, StreamingContext ctxt)        {            foreach (ItemBase item in _items)            {                PropertyInfo[] infos = item.GetType().GetProperties();                foreach (PropertyInfo pi in infos)                {                    info.AddValue(pi.Name, pi.GetValue(item, null), pi.GetType());                }            }        }

3.DataGridView列初始化(此处也可以根据自己的需求手动添加列,但是添加的时候要注意保持列命名要与步骤1中属性名称一致)

private void Init()        {            ItemBase item = new ItemBase();            PropertyInfo[] infos = item.GetType().GetProperties();            foreach (PropertyInfo pi in infos)            {                DataGridViewColumn dgvC;                if (pi.PropertyType == typeof(Boolean))                {                    dgvC = new DataGridViewCheckBoxColumn();                }                else                {                    dgvC = new DataGridViewTextBoxColumn();                }                dgvC.Name = pi.Name;                dgvC.HeaderText = pi.Name;                dgvTest.Columns.Add(dgvC);            }        }

4.添加行数据,保存,清空,加载的Demo

public void AddData(ItemBase item)        {            if (item != null)            {                int count = dgvTest.Rows.Count;                dgvTest.Rows.Add();                PropertyInfo[] infos = item.GetType().GetProperties();                foreach (PropertyInfo pi in infos)                {                    dgvTest[pi.Name, count].Value = pi.GetValue(item, null);                }            }        }        public List<ItemBase> GetDatas()        {            List<ItemBase> items = new List<ItemBase>();            int count = dgvTest.Rows.Count;            for (int i = 0; i < count; i++)            {                ItemBase item = new ItemBase();                PropertyInfo[] infos = item.GetType().GetProperties();                foreach (PropertyInfo pi in infos)                {                    pi.SetValue(item, dgvTest[pi.Name, i].Value, null);                }                items.Add(item);            }            return items;        }

1)添加数据

private void BtnAdd_Click(object sender, EventArgs e)        {            ItemBase ib = new ItemBase();            // 数据类初始化赋值            AddData(ib);        }

2)保存数据

private void BtnSave_Click(object sender, EventArgs e)        {            DataHub dh = new DataHub();            dh.Items = GetDatas();            XmlSerializer ser = new XmlSerializer(typeof(DataHub));            string path = System.Environment.CurrentDirectory + "\\Tracks.xml";            using (Stream fs = new FileStream(path, FileMode.Create, FileAccess.Write))            {                ser.Serialize(fs, dh);            }        }

3)清空数据

private void BtnClear_Click(object sender, EventArgs e)        {            dgvTest.Rows.Clear();        }

4)加载数据

 private void BtnLoad_Click(object sender, EventArgs e)        {            XmlSerializer ser = new XmlSerializer(typeof(DataHub));            string path = System.Environment.CurrentDirectory + "\\Tracks.xml";            DataHub tracks;            using (Stream fs = new FileStream(path, FileMode.Open, FileAccess.Read))            {                tracks = (DataHub)ser.Deserialize(fs);            }            foreach (ItemBase item in tracks.Items)            {                AddData(item);            }        }
原创粉丝点击