[WinForm]基于BindingSource的方法扩展

关键代码:

using System;

using System.Collections.Generic;

using System.Reflection;

using System.Windows.Forms;



namespace WinFormUtilHelpV2

{

    /// <summary>

    /// 基于.NET 2.0的BindingSource工具类

    /// </summary>

    public static class BindingSourceToolV2

    {

        /// <summary>

        /// 获取Control的BindingSource

        /// </summary>

        /// <param name="control">Control</param>

        /// <returns>BindingSource</returns>

        public static BindingSource GetBindingSource(this Control control)

        {

            if (control != null)

            {

                PropertyInfo _finded = control.GetType().GetProperty("DataSource");

                if (_finded != null)

                {

                    object _dbsource = _finded.GetValue(control, null);

                    if (_dbsource != null && _dbsource is BindingSource)

                    {

                        return _dbsource as BindingSource;

                    }

                }

            }

            return null;

        }

        /// <summary>

        /// 从BindingSource中条件移出

        /// </summary>

        /// <typeparam name="T">泛型</typeparam>

        /// <param name="dbSource">BindingSource</param>

        /// <param name="match">委托</param>

        /// <returns>条件移出个数</returns>

        public static int Remove<T>(this BindingSource dbSource, Predicate<T> match) where T : class

        {

            int _count = 0;

            if (dbSource != null)

            {

                for (int i = 0; i < dbSource.List.Count; i++)

                {

                    object _cur = dbSource.List[i];

                    if (match((T)_cur))

                    {

                        dbSource.List.Remove(_cur);

                        _count++;

                        i--;

                    }

                }

            }

            return _count;

        }

        /// <summary>

        ///  从BindingSource中条件查找

        /// </summary>

        /// <typeparam name="T">泛型</typeparam>

        /// <param name="dbSource">BindingSource</param>

        /// <param name="match">委托</param>

        /// <returns>没有查找到则返回NULL</returns>

        public static T Find<T>(this BindingSource dbSource, Predicate<T> match) where T : class

        {

            T _finded = null;

            if (dbSource != null)

            {

                foreach (T t in dbSource.List)

                {

                    if (match(t))

                    {

                        _finded = t;

                        break;

                    }

                }

            }

            return _finded;

        }

        /// <summary>

        ///  从BindingSource中条件查找集合

        /// </summary>

        /// <typeparam name="T">泛型</typeparam>

        /// <param name="dbSource">BindingSource</param>

        /// <param name="match">委托</param>

        /// <returns>没有查找到则返回NULL</returns>

        public static IList<T> FindAll<T>(this BindingSource dbSource, Predicate<T> match) where T : class

        {

            IList<T> _findedList = null;

            if (dbSource != null)

            {

                _findedList = new List<T>();

                foreach (T t in dbSource.List)

                {

                    if (match(t))

                    {

                        _findedList.Add(t);

                    }

                }

            }

            return _findedList;

        }



    }

}

代码测试:

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using WinFormUtilHelpV2;

using WinFormUtilHelpV2Test.Models;

namespace WinFormUtilHelpV2Test

{

    public partial class WinBindingSourceToolV2Test : Form

    {

        public WinBindingSourceToolV2Test()

        {

            InitializeComponent();

        }

        private void WinBindingSourceToolV2Test_Load(object sender, EventArgs e)

        {

            IList<Person> _source = new List<Person>();

            for (int i = 0; i < 10; i++)

            {

                Person _entity = new Person();

                _entity.Age = i;

                _entity.Name = "YanZhiwei" + i;

                _source.Add(_entity);

            }

            dataGridView1.SetBindingSource(_source);

        }

        private void button1_Click(object sender, EventArgs e)

        {

            Person _person = dataGridView1.GetBindingSource().Find<Person>(c => c.Age == 5);

            MessageBox.Show("条件查找:" + _person != null ? "查找到一个." : "未查找到.");

        }

        private void button2_Click(object sender, EventArgs e)

        {

            int _count = dataGridView1.GetBindingSource().Remove<Person>(c => c.Age >= 5);

            MessageBox.Show("成功移出:" + _count);

        }

        private void button3_Click(object sender, EventArgs e)

        {

            IList<Person> _personList = dataGridView1.GetBindingSource().FindAll<Person>(c => c.Age < 5);

            MessageBox.Show("条件查找:" + _personList != null ? "查找到" + _personList.Count + "个" : "未查找到.");

        }

    }

}

        /// <summary>

        /// DataGridView SetBindingSource

        /// </summary>

        /// <typeparam name="T">IList</typeparam>

        /// <param name="dataGrid">dataGrid</param>

        /// <param name="source">泛型</param>

        public static void SetBindingSource<T>(this DataGridView dataGrid, IList<T> source)

        {

            BindingList<T> _bindinglist = new BindingList<T>(source);

            BindingSource _source = new BindingSource(_bindinglist, null);

            dataGrid.DataSource = _source;

        }

测试结果:

image

image

image

image

希望有所帮助!

你可能感兴趣的:(WinForm)