程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 個人開發框架總結(二)

個人開發框架總結(二)

編輯:關於C#

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>
        /// 構造類別集合
         /// </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>
        /// 構造信息集合
        /// </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>
        /// 獲取選定節點對應的類別實體信息
        /// </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>
        /// 確認刪除信息
        /// </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>
        /// 構造信息集合
        /// </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 。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved