上一篇也写到了这个
现在对其做些优化,也可以说是一种尝试
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