WPF 数据库搜索到DataGrid 表格显示(二)

上一篇也写到了这个

   点击打开链接

现在对其做些优化,也可以说是一种尝试


1. 第一部分  快速通知

/// <summary>
    /// 用于 非继承类的 快速 建立通知的方法
    /// </summary>
    public class NotifyPropertyClass : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged = delegate { };

        private Dictionary<string, PropertyChangedEventArgs> PropertyList = new Dictionary<string, PropertyChangedEventArgs>();

        virtual internal protected void OnPropertyChanged(string propertyName)
        {
            if (!PropertyList.ContainsKey(propertyName))
            {
                PropertyList.Add(propertyName, new PropertyChangedEventArgs(propertyName));
            }

            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, PropertyList[propertyName]);
            }
        }

        protected void SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
        {
            if (object.Equals(storage, value)) return;
            storage = value;
            this.OnPropertyChanged(propertyName);
        }

        //protected void SetProperty<T>(ref T storage, T value, Expression<Func<T>> expr)
        //{
        //    //SetProperty(ref ishousepage, value, () => this.IsHousePage);
        //    var bodyExpr = expr.Body as System.Linq.Expressions.MemberExpression;
        //    if (bodyExpr == null)
        //    {
        //        throw new ArgumentException("Expression must be a MemberExpression!", "expr");
        //    }
        //    var propInfo = bodyExpr.Member as PropertyInfo;
        //    if (propInfo == null)
        //    {
        //        throw new ArgumentException("Expression must be a PropertyExpression!", "expr");
        //    }
        //    var propName = propInfo.Name;
        //    storage = value;
        //    this.OnPropertyChanged(propName);


        //}

    }

2.第二部分  抽象表格属性

    /// <summary>
    /// 页面数据 翻页 当前页 总页数等信息
    /// </summary>
    public class PageDataBase : NotifyPropertyClass
    {

        /// <summary>
        /// 当前页页码
        /// </summary>
        private int _pagenow = 1;
        public int PageNow
        {
            get { return _pagenow; }
            set
            {
                _pagenow = value;
                OnPropertyChanged("PageNow");
            }
        }
        /// <summary>
        /// 页面显示条数
        /// </summary>
        private int _pagesize = 10;
        public int PageSize
        {
            get { return _pagesize; }
            set
            {
                _pagesize = value;
                OnPropertyChanged("PageSize");
                OnPropertyChanged("PageNow");
                OnPropertyChanged("TotalPage");
            }
        }
        /// <summary>
        /// 条数数
        /// </summary>
        internal int _totalnum = 0;
        public int TotalNum
        {
            get { return _totalnum; }
            set
            {
                _totalnum = value;
                OnPropertyChanged("TotalNum");
                OnPropertyChanged("PageSize");
                OnPropertyChanged("PageNow");
                OnPropertyChanged("TotalPage");
            }
        }
        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPage
        {
            get
            {
                if (TotalNum == 0)
                    return 1;
                return (int)Math.Ceiling((double)TotalNum / PageSize);
            }
        }
        /// <summary>
        /// 消息
        /// </summary>
        private string _message;

        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }


        /// <summary>
        /// 数据部分
        /// </summary>
        private DataTable _database;
        public DataTable DataBase
        {
            get { return _database; }
            set
            {
                _database = value;
                OnPropertyChanged("DataBase");
            }
        }

    }

3.第三部分 抽象事件

 

   /// <summary>
    /// 页面数据 翻页 当前页 总页数等信息
    /// </summary>
    public class PageDataOperate : PageDataBase
    {

        public string WhereKey { get; set; }

        public delegate FeedBack<DataTable> LoadDataEventHandler(int PageNow, int PageSize, ref int TotalNum, string WhereKey = "");

        public event LoadDataEventHandler LoadDataEvent;

        /// <summary>
        /// 加载数据
        /// </summary>
        public void LoadData()
        {
            if (PageSize <= 0 || PageNow <= 0)
            {
                return;
            }
            PageNow = 1;

            this.WhereKey = WhereKey;

            DBSelect();//执行搜索
        }

        /// <summary>
        /// 刷新数据
        /// </summary>
        public void RefreshData()
        {
            DBSelect();//执行搜索
        }


        /// <summary>
        /// 下一页上一页
        /// </summary>
        /// <param name="Type">+1 则表示下一页 -1表示上一页  </param>
        public void NextPage(int Type)
        {
            var Act = Type;

            if (Act == -1 && this.PageNow == 1)
            {//已经是第一页
                this.PageNow = 1;
                this.Message = "已经是第一页";
                return;
            }
            if (Act == 1 && this.PageNow >= this.TotalPage)
            { //已经是最后一页
                this.PageNow = this.TotalPage;
                this.Message = "已经是最后一页";
                return;
            }
            this.PageNow += Act;
            DBSelect();//执行搜索

        }

        /// <summary>
        /// 执行搜索
        /// </summary>
        public void DBSelect()
        {

            if (LoadDataEvent == null)
            {
                return;
            }
            var feedback = LoadDataEvent(this.PageNow, this.PageSize, ref this._totalnum, this.WhereKey);
            this.Message = feedback.status ? string.Empty : feedback.message;
            this.TotalNum = this._totalnum;
            this.DataBase = feedback.result;
        }

    }

/// <summary>
/// 返回信息的结构体
/// </summary>
public struct FeedBack<T>
{
    /// <summary>
    /// 状态,返回true/false
    /// </summary>
    public bool status { get; set; }
    /// <summary>
    /// 错误代码
    /// </summary>
    public int code { get; set; }
    /// <summary>
    /// Json结构的对象
    /// </summary>
    public T result { get; set; }
    /// <summary>
    /// 信息
    /// </summary>
    public string message { get; set; }
}

4.第四部分 调用

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = this;

            this.dataGrid.ItemSource = pagedataOperate.DataBase;
            //这一句 这样绑定
            //   ItemSource ={Bingding pagedataOperate.DataBase}
            // <DataGridTextColumn Width="80*" Header="联系电话" Binding="{Binding mobile_phone}"/>


            pagedataOperate.LoadDataEvent += PagedataOperate_LoadDataEvent;
            pagedataOperate.WhereKey = "";
            pagedataOperate.LoadData();
        }

        private FeedBack<System.Data.DataTable> PagedataOperate_LoadDataEvent(int PageNow, int PageSize, ref int TotalNum, string WhereKey = "")
        {
            throw new NotImplementedException();

        }

        PageDataOperate pagedataOperate = new PageDataOperate();




        /// <summary>
        /// 下一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ChangePage_Click(object sender, RoutedEventArgs e)
        {
            var But = sender as Button;
            var Act = int.Parse(But.Tag.ToString());

            pagedataOperate.NextPage(Act);
            if (!string.IsNullOrEmpty(pagedataOperate.Message))
            {
                MessageBox.Show(pagedataOperate.Message);
            }
        }


    }

在点击某一行 或者双击列的时候取出当前行的数据

      private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (dataGrid.SelectedIndex == -1)
            {
                return;
            }
            if (dataGrid.SelectedItem == null)
            {
                return;
            }
            var TempDataRow = (dataGrid.SelectedItem as DataRow);
            var house_number_id = TempDataRow.Field<int>("house_number_id");
            var house_number_id = TempDataRow["house_number_id"];
            if (temp == null)
            {
                return;
            }
            else
            {
                //dowork
            }
        }


如果需要取出一整行的数据可以使用转换 DataRow 转换成类 随意搜有很多利用反射的例子

    public static class staticExtendConvert
    {
        /// <summary>  
        /// 通过DataRow 填充实体  
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="dr"></param>  
        /// <returns></returns>  
        public static T GetModelByDataRow<T>(this System.Data.DataRow dr) where T : new()
        {
            T model = new T();
            foreach (PropertyInfo pInfo in model.GetType().GetProperties())
            {
                object val = getValueByColumnName(dr, pInfo.Name);
                pInfo.SetValue(model, val, null);
            }
            return model;
        }

        //返回DataRow 中对应的列的值。  
        public static object getValueByColumnName(this System.Data.DataRow dr, string columnName)
        {
            if (dr.Table.Columns.IndexOf(columnName) >= 0)
            {
                if (dr[columnName] == DBNull.Value)
                    return null;
                return dr[columnName];
            }
            return null;
        }


    }

经反思 果然是 不能把功能方法设计的太复杂  不然别人懒得看 ,第二调用的规则让别人难以理解

此处是使用 event 替换了之前的delegate



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值