iotgateway/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Grid/GridHeaderExtension.cs

311 lines
11 KiB
C#
Raw Normal View History

2021-12-14 06:10:44 +00:00
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
namespace WalkingTec.Mvvm.Core
{
/// <summary>
/// GridColumn Extension
/// </summary>
public static class GridHeaderExtension
{
/// <summary>
/// 创建表头
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="V"></typeparam>
/// <param name="self"></param>
/// <param name="columnExp">绑定猎头表达式</param>
/// <param name="width">宽度</param>
/// <returns></returns>
public static GridColumn<T> MakeGridHeader<T, V>(this IBasePagedListVM<T, V> self
, Expression<Func<T, object>> columnExp
, int? width = null
)
where T : TopBasePoco
where V : ISearcher
{
MemberExpression me = null;
if (columnExp is MemberExpression)
{
me = columnExp as MemberExpression;
}
else if (columnExp is LambdaExpression)
{
var le = columnExp as LambdaExpression;
if (le.Body is MemberExpression)
{
me = le.Body as MemberExpression;
}
}
var alignType = GridColumnAlignEnum.Center;
if (me != null)
{
var propType = me.Type;
if (propType == typeof(string))
{
alignType = GridColumnAlignEnum.Left;
}
}
return new GridColumn<T>(columnExp, width) { ColumnType = GridColumnTypeEnum.Normal, Align = alignType };
}
/// <summary>
/// 创建一个间隙列
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="V"></typeparam>
/// <param name="self"></param>
/// <returns></returns>
public static GridColumn<T> MakeGridHeaderSpace<T, V>(this IBasePagedListVM<T, V> self)
where T : TopBasePoco
where V : ISearcher
{
return new GridColumn<T>() { ColumnType = GridColumnTypeEnum.Space };
}
/// <summary>
/// 创建一个父级表头
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="V"></typeparam>
/// <param name="self"></param>
/// <param name="title">标题</param>
/// <returns></returns>
public static GridColumn<T> MakeGridHeaderParent<T, V>(this IBasePagedListVM<T, V> self, string title
)
where T : TopBasePoco
where V : ISearcher
{
return new GridColumn<T>() { Title = title };
}
public static GridColumn<T> MakeGridHeaderAction<T, V>(this IBasePagedListVM<T, V> self
, string title = null
, int? width = 160
, int? rowspan = null
)
where T : TopBasePoco
where V : ISearcher
{
return new GridColumn<T>()
{
ColumnType = GridColumnTypeEnum.Action,
Width = width,
Fixed = GridColumnFixedEnum.Right,
Title = title ?? CoreProgram._localizer?["Sys.Operation"]
};
}
#region GridColumn Property Setter
/// <summary>
/// 设定字段名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="field">字段名的设定非常重要,是表格数据列的唯一标识,默认属性对应的名字</param>
/// <returns></returns>
public static GridColumn<T> SetField<T>(this GridColumn<T> self, string field)
where T : TopBasePoco
{
self.Field = field;
return self;
}
/// <summary>
/// 设定标题名称
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="title">即表头各列的标题,默认属性对应的 DisplayName 或 属性名 </param>
/// <returns></returns>
public static GridColumn<T> SetTitle<T>(this GridColumn<T> self, string title)
where T : TopBasePoco
{
self.Title = title;
return self;
}
/// <summary>
/// 设定列宽
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="width">列宽的设定也通常是必须的(“特殊列”除外,如:复选框列、工具列等),它关系到表格的整体美观程度。</param>
/// <returns></returns>
public static GridColumn<T> SetWidth<T>(this GridColumn<T> self, int width)
where T : TopBasePoco
{
self.Width = width;
return self;
}
/// <summary>
/// 单元格事件名称
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="eEvent"></param>
/// <returns></returns>
public static GridColumn<T> SetEvent<T>(this GridColumn<T> self, string eEvent) where T : TopBasePoco
{
self.Event = eEvent;
return self;
}
///// <summary>
///// 设定当前列头 列横跨的单元格数
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="self"></param>
///// <param name="colspan">这种情况下不用设置 Field 和 Width </param>
///// <returns></returns>
//public static GridColumn<T> SetColspan<T>(this GridColumn<T> self, int colspan)
// where T : TopBasePoco
//{
// self.Colspan = colspan;
// return self;
//}
///// <summary>
///// 设定当前列头 纵向跨越的单元格数
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="self"></param>
///// <param name="rowspan">纵向跨越的单元格数</param>
///// <returns></returns>
//public static GridColumn<T> SetRowspan<T>(this GridColumn<T> self, int rowspan)
// where T : TopBasePoco
//{
// self.Rowspan = rowspan;
// return self;
//}
/// <summary>
/// 设定是否允许排序 (ASCII码排序)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="sort">如果设置 true则在对应的表头显示排序icon从而对列开启排序功能。</param>
/// <returns></returns>
public static GridColumn<T> SetSort<T>(this GridColumn<T> self, bool sort = true)
where T : TopBasePoco
{
self.Sort = sort;
return self;
}
/// <summary>
/// 设定是否固定列
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="fixed">如果设置 Left 或 Right则对应的列将会被固定在左或右不随滚动条而滚动。</param>
/// <returns></returns>
public static GridColumn<T> SetFixed<T>(this GridColumn<T> self, GridColumnFixedEnum? @fixed)
where T : TopBasePoco
{
self.Fixed = @fixed;
return self;
}
/// <summary>
/// 设定对齐方式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="align"></param>
/// <returns></returns>
public static GridColumn<T> SetAlign<T>(this GridColumn<T> self, GridColumnAlignEnum align)
where T : TopBasePoco
{
self.Align = align;
return self;
}
///// <summary>
///// 设定是否允许编辑
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="self"></param>
///// <param name="edit">如果设置 true则对应列的单元格将会被允许编辑目前只支持type="text"的input编辑。</param>
///// <returns></returns>
//public static GridColumn<T> SetEdit<T>(this GridColumn<T> self, bool edit = true)
// where T : TopBasePoco
//{
// self.Edit = edit;
// return self;
//}
///// <summary>
///// 设定自定义模板
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="self"></param>
///// <param name="templet">在默认情况下单元格的内容是完全按照数据接口返回的content原样输出的
///// 如果你想对某列的单元格添加链接等其它元素,你可以借助该参数来轻松实现。
///// 这是一个非常实用的功能,你的表格内容会因此而丰富多样。
///// </param>
///// <returns></returns>
//public static GridColumn<T> SetTemplet<T>(this GridColumn<T> self, string templet)
// where T : TopBasePoco
//{
// self.Templet = templet;
// return self;
//}
[Obsolete("该方法已经被弃用,请使用 SetHide 代替")]
public static GridColumn<T> SetHidden<T>(this GridColumn<T> self, bool hidden = true) where T : TopBasePoco
{
return self;
}
/// <summary>
/// 是否隐藏
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="hide"></param>
/// <returns></returns>
public static GridColumn<T> SetHide<T>(this GridColumn<T> self, bool hide = true) where T : TopBasePoco
{
self.Hide = hide;
return self;
}
/// <summary>
/// 设定列宽不可改变
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="unresize"></param>
/// <returns></returns>
public static GridColumn<T> SetUnResize<T>(this GridColumn<T> self, bool unresize = true)
where T : TopBasePoco
{
self.UnResize = unresize;
return self;
}
/// <summary>
/// 设定单元格编辑类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="editType">单元格编辑类型</param>
/// <param name="listitems">listitems</param>
/// <returns></returns>
public static GridColumn<T> SetEditType<T>(this GridColumn<T> self, EditTypeEnum editType = EditTypeEnum.Text, List<ComboSelectListItem> listitems = null)
where T : TopBasePoco
{
self.EditType = editType;
self.ListItems = listitems;
return self;
}
#endregion
}
}