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 。