BaseTreeListForm 提供数据显示的窗体,通过重写方法实现你的数据显示
个人开发框架总结(二)       
    属性
    AllowPaging:是否允许分页,如果允许,在重载BuildLists时需将PageArgs赋给DataAccess的PageArgs
    AllowAddNew:是否允许新增,如果不允许,工具栏上的图标将不可见
    AllowModify:是否允许修改,如果不允许,工具栏上的图标将不可见
    AllowDelete:是否允许删除,如果不允许,工具栏上的图标将不可见
    AllowImport:是否允许导入,默认为不导入。
    AllowTreeList:是否允许信息列表中显示树
    TypeRootName:左边类别树中顶级分类的名称
    TypeNameField:左边类别树中分类名称的字段名,一般规定为Name
    ChildCountField:左边类别树中判断是否有子节点的字段名,一般规定为ChildCount
    HasTreeRegion:是否显示左边类别树
    HasTreeToolbar:是否显示左边类别树中的工具栏菜单
    DblClickSelect:是否在双击右边信息条目时关闭窗体,并返回所选定的信息对象
    PageArgs:分页参数
    Purview:三态权限控制(添加、修改、删除)
    EditFormType:提供信息修改的窗体的类别名,该窗体应该继承BaseEditForm
    EditFormParmas:信息修改的窗体的构造参数
    TypeEditFormType:提供类别修改的窗体的类别名,该窗体应该继承BaseEditForm
    TypeEditFormParmas:类别修改窗体的构造参数
    QueryFormType:提供查询的窗体的类别名,该窗体应该继承BaseQueryForm
    ModelType:指定信息对象的类别,在有导入接口时才需要对些属性进行设置
    InfoParentId:指定默认的父ID字段,一般规定为ParentId
    ResultInfo:双击后返回的信息对象,对应于DblClickSelect属性
    ReloadOnModify:信息修改后是否重新从数据库加载显示,如果否,则使用所修改的对象显示
    FillOnLoad:窗体加载时是否加载信息数据

    保护的方法
    RegisterShortcutKey:注册窗体快捷键
    UnRegisterShortcutKey:注销窗体快捷键
    GetInfoFields:获取当前信息显示的所有字段数组,对应于Config/*.cls文件中定义的列
    CreateTypeButton:创建类别工具栏按钮
    CreateButton:创建信息工具栏按钮
    Reload:重新加载信息数据
    GetSelectedInfo:当前选择的多个信息
    GetSelectedInfoCount:获得选定信息的个数
    GetSelectedType

    重载方法
    FormatValue:格式化数据,在数据填充Node前,对数据进行处理,比如枚举的转换
    GetItemValue:对显示的信息数据进行处理
    BuildLists:提供信息数据 isfull:是否全部加载数据,如果使用分页,将只取出当前页内数据,但在打印及导出时,该值应该为true
    BuildTypes:提供分类数据
    CreateButtons:创建信息部份的工具栏
    CreateTypeButtons:创建分类部份的工具栏
    GetSelectedInfo:返回选定行的信息
    GetSelectedType:返回选定的类别
    ConfirmDelete:确认删除信息数据,ids为信息的id数组
    ConfirmDeleteType:确认删除类别
    AddInfo:添加信息数据
    ModifyInfo:修改信息数据
    RefreshInfo:刷新单条信息
    DeleteInfo:删除信息
    AddType:添加类别
    ModifyType:修改类别
    DeleteType:删除类别
    QueryInfo:查询信息
    OnDoubleClickInfo:双击信息时的处理
    ExportInfo:导出数据
    PrintInfo:打印数据
    ImportInfo:导入数据
    CreateDataHelper:提供DataHelper对象,在使用导入接口时才设置
    InsertRowValidate:导入,插入行时数据验证
    BeforeInsertRow:导入,数据插入前的处理
    BeforeSaveRow:导入,单条数据保存后的处理
    SetReportConfig:打印,设置报表上相关信息
    QuerySetTypeListData:查询,为查询窗体中的TypeListComboBox填充数据
    QuerySetTypeTreeData:查询,为查询窗体中的TypeTreeComboBox填充数据
    DisplayCount:显示统计数据,放在BuildLists里

    实例化时,要传入类别编辑窗体和信息编辑窗体的类别,这样可以直接调用窗体进行数据的添加与修改,如:
    EditFormType = typeof(frmEmployeeInfo);
    TypeEditFormType = typeof(frmDepartInfo);

    BuildTypes 构造左边分类的数据 parentId参数为父级id


        /// 构造类别集合
         
/// </summary>
        
/// <param name="parentId"></param>
        
/// <returns></returns>
        protected override IList BuildTypes(int parentId)
        {
            
//数据实体集合
            TCompanyTypes list = null;
            
try
            {
                
//数据访问类
                ATCompanyType objDAL = new ATCompanyType;
                QueryBuilder qb 
= new QueryBuilder();
                qb.Append(QueryRelation.And, QueryCompare.Equal, TCompanyType._BaseType, baseType.ToString(
"D"));
                qb.Append(QueryRelation.And, QueryCompare.Equal, TCompanyType._ParentId, parentId);
                list 
= objDAL.Select(qb.ToString(), "Sort Desc"null);
                objDAL.Dispose();
                objDAL 
= null;
            }
            
catch (System.Exception e)
            {
                Utility.ShowErrorMessage(e.Message);
            }
            
return list;
        }

    BuildLists 构造右边信息数据

        /// 构造信息集合
        
/// </summary>
        
/// <param name="queryArgs"></param>
        
/// <param name="isFull"></param>
        
/// <returns></returns>
        protected override IList BuildLists(bool isFull)
        {
            TCompanies list 
= null;
            
try
            {
                ATCompany objDAL 
= (ATCompany)DAFactory.CreateDA(typeof(ATCompany));
                
if (!isFull) objDAL.PageArgs = base.PageArgs;
                
//得到所有字段
                string[] fields = GetInfoFields();
                QueryBuilder qb 
= new QueryBuilder();
                qb.Append(QueryRelation.And, QueryCompare.Equal, TCompany._BaseType, baseType.ToString(
"D"));
                qb.Append(QueryRelation.And, QueryCompare.Equal, TCompany._IsDelete, 
0);
                qb.Append(QueryRelation.And, QueryCompare.Equal, TCompany._ParentId, ContextArgs.Instance.CompanyId);
                
if (QueryArgs.TypeId != 0)
                {
                    qb.Append(QueryRelation.And, QueryCompare.Equal, TCompany._CompanyTypeId, QueryArgs.TypeId);
                }
                
//加上查询的条件
                qb += QueryArgs.QueryBuilder;
                list 
= objDAL.Select(qb, QueryArgs.Order, fields);
                
if (!isFull) base.PageArgs = objDAL.PageArgs;
                objDAL.Dispose();
                objDAL 
= null;
            }
            
catch (System.Exception e)
            {
                Utility.ShowErrorMessage(e.Message);
            }
            
return list;
        }

 

    这里的列头是通过xml文件创建的,相应的配置类为FaibClass.Common.Windows.Config.ColumnConfigItem。在Config目录下创建 窗体类名称.cls 文件,就可以显示列了。

显示配置文件(Config/*.cls)
<Columns>
  <Column>
    <Type> TreeList的Column的类别,可以是Column、NumberColumn、DateTimeColumn等
    <Text> 列头上显示的文本
    <Width> 宽度
    <ReportWidth> 报表中列的宽度,如果未设置使用Width
    <Align> 对齐
    <ImageIndex> 图标索引
    <Visible> 是否可见
    <Key> 对应的表字段
    <Formater> 格式,当Type为NumberColumn或DateTimeColumn时设置,具体可参考Forms库
    <CustomFormat> 自定义格式
    <EnumType> 枚举类别名
    <CountType> 统计类别
    <CountGroupBy> 要进行分组统计的字段名
    <CountGroupType> 可以对进行分组的字段进行枚举转换,这里是枚举的类名
    <NotReport> 不显示在打印报表里
    <Group> 可以根据不同的组设置列的可见性,注意这个值要使用FlagsAttribute
 </Column>
</Columns>

    GetSelectedType 获得当前选中的类别的实体信息


        /// 获取选定节点对应的类别实体信息
        
/// </summary>
        
/// <param name="node"></param>
        
/// <returns></returns>
        protected override BaseModel GetSelectedType(Node node)
        {
            
try
            {
                ATDepart objDAL 
= (ATDepart)DAFactory.CreateDA(typeof(ATDepart));
                
//Node.Tag保存的是主键值
                TDepart info = objDAL.Get(node.Tag);
                objDAL.Dispose();
                
return info;
            }
            
catch (System.Exception e)
            {
                Utility.ShowErrorMessage(e.Message);
            }
            
return null;
        }

    GetSelectedInfo 获得当前选中的信息的实体信息,代码与上面的一样。

    ConfirmDelete 确认删除信息

        /// 确认删除信息
        
/// </summary>
        
/// <param name="id">选中的id数组</param>
        
/// <returns></returns>
        protected override bool ConfirmDelete(params string[] ids)
        {
            
try
            {
                ATEmployee objDAL 
= (ATEmployee)DAFactory.CreateDA(typeof(ATEmployee));
                
//更改删除标记
                bool result = objDAL.DataHelper.ExecuteNonQuery("UPDATE " + TEmployee._TableName +
                    
" SET " + TEmployee._IsDelete + " = 1 WHERE " + TEmployee._PrimaryKey +
                    
" IN (" + string.Join(",", ids) + ")"> 0;
                
//真正的删除
                
//bool result = objDAL.DeleteBy(ids);
                objDAL.Dispose();
                
return result;
            }
            
catch (System.Exception e)
            {
                Utility.ShowErrorMessage(e.Message);
            }
            
return false;
        }


    ConfirmDeleteType 确认删除类别,代码与上面的一样

    数据的查询,可以不用指定QueryFormType,而在Config下创建 窗体类名称.pcs 文件,相应的配置类为FaibClass.Common.Windows.Config.PropertyColumnConfig。具体的配置请关注后期的BaseQueryForm类。

    数据的导入,将AllowImport设为true后,在Config下配置 窗体类名称.ips 文件,就可以进行数据导入了,相应的配置类为FaibClass.Common.Windows.Config.ImportConfig。
个人开发框架总结(二)

导入配置文件(Config/*.ips)
<ImportConfig>
  <TableName> 数据库表名
  <Columns>
    <Column>
      <Name> Excel中的列头名
      <Key> 表中的字段名
      <Primary> 是否唯一性
      <ConvertForm> 从哪个表的哪个字段转换 Table.TextField
      <ConvertTo> 转换到哪个字段 Table.IdField
      <Sample> 使用说明
      <Type> 类别,如果是Enum则要指定EnumType
      <Reference> 使用引用,则ConvertForm和ConvertTo相应的要配置
    </Column>
  </Columns>
</ImportConfig>

比如:
    <Column>
      <Name>推荐人类别</Name>
      <Key>RecommendType</Key>
      <Type>Enum</Type>
      <EnumType>FBS.Chance.Model.RecommendType, Model</EnumType>
      <Sample>员工(只能填员工,代理商/商家或者会员)</Sample>
    </Column>
    <Column>
      <Name>推荐人</Name>
      <Key>Recommend</Key>
      <Reference>RecommendType</Reference>
      <ConvertForm>会员:TMember.Card,员工:TEmployee.Code,代理商/商家:TCompany.Code</ConvertForm>
      <ConvertTo>TMember.Id,TEmployee.Id,TCompany.Id</ConvertTo>
      <Sample>huangxd(推荐人类别为会员时填入卡号,员工及商家填入帐号)</Sample>
    </Column>
    这个地方的推荐人有三种类型,而会员表里存储的推荐人ID是对应表中的ID,会员填入卡号转换为TMember中的Id,员工填入帐号转换为TEmployee中的Id等等。
    这时所说的Binary类型指的是,多个ID用(,)号连接后转换为byte存储,比如会员的爱好有多种,是定义在TInterest里的,这里就这样配置
    <Column>
      <Name>兴趣爱好</Name>
      <Key>Interest</Key>
      <Type>Binary</Type>
      <ConvertForm>TInterest.Name</ConvertForm>
      <ConvertTo>TInterest.Id</ConvertTo>
      <Sample>足球,游泳,登山(用半角逗号分隔)</Sample>
    </Column>

    BaseTreeListForm还可以在信息栏里显示树型结构,将AllowTreeList设为true,在BuildLists里使用QueryArgs.ParentId:


        /// 构造信息集合
        
/// </summary>
        
/// <param name="isFull"></param>
        
/// <returns></returns>
        protected override IList BuildLists(bool isFull)
        {
            TRegions list 
= null;
            
try
            {
                ATRegion objDAL 
= (ATRegion)DAFactory.CreateDA(typeof(ATRegion));
                
string[] fields = GetInfoFields();

                QueryBuilder qb 
= new QueryBuilder();
                qb.Append(QueryRelation.And, QueryCompare.Equal, TRegion._ParentId, QueryArgs.ParentId);
                list 
= objDAL.Select(qb.ToString(), QueryArgs.Order, fields);
                objDAL.Dispose();
            }
            
catch (System.Exception e)
            {
                Utility.ShowErrorMessage(e.Message);
            }
            
return list;
        }

    也可以进行打印,在Config下配置 窗体类名称.rps 即可,详细的说明请参考BaseReportForm。

    BaseTreeListForm就说到这里,下一节介绍 BaseEditForm 。 
    http://www.cnblogs.com/faib/archive/2009/05/02/1447953.html

相关文章:

  • 2022-02-16
  • 2022-12-23
  • 2021-05-05
  • 2021-07-09
  • 2021-06-14
  • 2022-12-23
  • 2021-05-28
  • 2021-08-05
猜你喜欢
  • 2021-06-04
  • 2021-06-28
  • 2021-09-15
  • 2021-12-30
  • 2021-10-01
  • 2021-07-28
  • 2021-12-06
相关资源
相似解决方案