作者:地沟油
前言:
由于想到为以后做打算,增删查改必不可少,要是每个表都要写一次,就增加了多余的代码量,大大的增加工作量。
为避免这个出现,所以决定使用泛型写一个派生类,实现增删查改功能。(想过用其他第三方模版生成,感觉太麻烦。后来又想过用tt模版,又感觉不太好。)
1.我们在ivw.Dao类中新建一个BaseDao类,写入以下代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using ivw.Models; 8 using System.Data.Entity; 9 using ivw.IDao; 10 using System.Data.Entity.Infrastructure; 11 12 namespace ivw.Dao.SqlServer 13 { 14 public class BaseDao<T> where T : class 15 { 16 /// <summary> 17 /// 获取数据源 18 /// </summary> 19 /// <returns></returns> 20 public List<T> GetList() 21 { 22 using (DBContainer db = new DBContainer()) 23 { 24 return db.Set<T>().ToList(); 25 } 26 } 27 28 /// <summary> 29 /// 插入一个实体 30 /// </summary> 31 /// <param name="model"></param> 32 /// <returns></returns> 33 public int Create(T model) 34 { 35 using (DBContainer db = new DBContainer()) 36 { 37 db.Set<T>().Add(model); 38 return db.SaveChanges(); 39 } 40 } 41 42 /// <summary> 43 /// 批量插入一个实体 44 /// </summary> 45 /// <param name="models"></param> 46 /// <returns></returns> 47 public int Create(List<T> models) 48 { 49 using (DBContainer db = new DBContainer()) 50 { 51 db.Set<T>().AddRange(models); 52 return db.SaveChanges(); 53 } 54 } 55 56 /// <summary> 57 /// 修改一个实体 58 /// </summary> 59 /// <param name="model"></param> 60 /// <returns></returns> 61 public int Edit(T model) 62 { 63 using (DBContainer db = new DBContainer()) 64 { 65 if (db.Entry<T>(model).State == EntityState.Modified) 66 { 67 return db.SaveChanges(); 68 } 69 else if (db.Entry<T>(model).State == EntityState.Detached) 70 { 71 try 72 { 73 db.Set<T>().Attach(model); 74 db.Entry<T>(model).State = EntityState.Modified; 75 } 76 catch (InvalidOperationException) 77 { 78 return 0; 79 } 80 return db.SaveChanges(); 81 } 82 return 0; 83 } 84 } 85 86 /// <summary> 87 /// 删除一个实体 88 /// </summary> 89 /// <param name="model"></param> 90 /// <returns></returns> 91 public int Delete(T model) 92 { 93 using (DBContainer db = new DBContainer()) 94 { 95 db.Set<T>().Remove(model); 96 return db.SaveChanges(); 97 } 98 } 99 100 /// <summary> 101 /// 批量删除实体 102 /// </summary> 103 /// <param name="models"></param> 104 /// <returns></returns> 105 public int Delete(List<T> models) 106 { 107 using (DBContainer db = new DBContainer()) 108 { 109 db.Set<T>().RemoveRange(models); 110 return db.SaveChanges(); 111 } 112 } 113 114 /// <summary> 115 /// 删除主键实体 116 /// </summary> 117 /// <param name="KeyValues"></param> 118 /// <returns></returns> 119 public int Delete(params object[] KeyValues) 120 { 121 T model = GetById(KeyValues); 122 if (model != null) 123 { 124 using (DBContainer db = new DBContainer()) 125 { 126 db.Set<T>().Remove(model); 127 return db.SaveChanges(); 128 } 129 } 130 return 0; 131 } 132 133 /// <summary> 134 /// 根据主键获取实体 135 /// </summary> 136 /// <param name="KeyValues"></param> 137 /// <returns></returns> 138 public T GetById(params object[] KeyValues) 139 { 140 using (DBContainer db = new DBContainer()) 141 { 142 return db.Set<T>().Find(KeyValues); 143 } 144 } 145 146 /// <summary> 147 /// 判断该实体是否存在 148 /// </summary> 149 /// <param name="id"></param> 150 /// <returns></returns> 151 public bool IsExist(object id) 152 { 153 return GetById(id) != null; 154 } 155 156 /// <summary> 157 /// 执行一条SQL语句 158 /// </summary> 159 /// <param name="sqlQuery"></param> 160 /// <returns></returns> 161 public int ExecuteSqlCommand(String sqlQuery) 162 { 163 using (DBContainer db = new DBContainer()) 164 { 165 return db.Database.ExecuteSqlCommand(sqlQuery); 166 } 167 } 168 169 /// <summary> 170 /// 异步执行一条SQL语句 171 /// </summary> 172 /// <param name="sqlQuery"></param> 173 /// <returns></returns> 174 public Task<int> ExecuteSqlCommandAsync(String sqlQuery) 175 { 176 using (DBContainer db = new DBContainer()) 177 { 178 return db.Database.ExecuteSqlCommandAsync(sqlQuery); 179 } 180 } 181 182 /// <summary> 183 /// 查询一条语句返回结果集 184 /// </summary> 185 /// <param name="sqlQuery"></param> 186 /// <returns></returns> 187 public DbRawSqlQuery<T> SqlQuery(String sqlQuery) 188 { 189 using (DBContainer db = new DBContainer()) 190 { 191 return db.Database.SqlQuery<T>(sqlQuery); 192 } 193 } 194 195 /// <summary> 196 /// 查询一条语句返回结果集 197 /// </summary> 198 /// <param name="sqlQuery"></param> 199 /// <param name="paras"></param> 200 /// <returns></returns> 201 public DbRawSqlQuery<T> SqlQuery(String sqlQuery, params object[] paras) 202 { 203 using (DBContainer db = new DBContainer()) 204 { 205 return db.Database.SqlQuery<T>(sqlQuery, paras); 206 } 207 } 208 } 209 }
2.在ivw.IDao类中新建一个IBaseDao接口,写入以下代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity.Infrastructure; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ivw.IDao 9 { 10 public interface IBaseDao<T> where T : class 11 { 12 /// <summary> 13 /// 获取数据源 14 /// </summary> 15 /// <returns></returns> 16 List<T> GetList(); 17 18 /// <summary> 19 /// 插入一个实体 20 /// </summary> 21 /// <param name="model"></param> 22 /// <returns></returns> 23 int Create(T model); 24 25 /// <summary> 26 /// 批量插入一个实体 27 /// </summary> 28 /// <param name="models"></param> 29 /// <returns></returns> 30 int Create(List<T> models); 31 32 /// <summary> 33 /// 修改一个实体 34 /// </summary> 35 /// <param name="model"></param> 36 /// <returns></returns> 37 int Edit(T model); 38 39 /// <summary> 40 /// 删除一个实体 41 /// </summary> 42 /// <param name="model"></param> 43 /// <returns></returns> 44 int Delete(T model); 45 46 /// <summary> 47 /// 批量删除实体 48 /// </summary> 49 /// <param name="models"></param> 50 /// <returns></returns> 51 int Delete(List<T> models); 52 53 /// <summary> 54 /// 删除主键实体 55 /// </summary> 56 /// <param name="KeyValues"></param> 57 /// <returns></returns> 58 int Delete(params object[] KeyValues); 59 60 /// <summary> 61 /// 根据主键获取实体 62 /// </summary> 63 /// <param name="KeyValues"></param> 64 /// <returns></returns> 65 T GetById(params object[] KeyValues); 66 67 /// <summary> 68 /// 判断该实体是否存在 69 /// </summary> 70 /// <param name="id"></param> 71 /// <returns></returns> 72 bool IsExist(object id); 73 74 /// <summary> 75 /// 执行一条SQL语句 76 /// </summary> 77 /// <param name="sqlQuery"></param> 78 /// <returns></returns> 79 int ExecuteSqlCommand(String sqlQuery); 80 81 /// <summary> 82 /// 异步执行一条SQL语句 83 /// </summary> 84 /// <param name="sqlQuery"></param> 85 /// <returns></returns> 86 Task<int> ExecuteSqlCommandAsync(String sqlQuery); 87 88 /// <summary> 89 /// 查询一条语句返回结果集 90 /// </summary> 91 /// <param name="sqlQuery"></param> 92 /// <returns></returns> 93 DbRawSqlQuery<T> SqlQuery(String sqlQuery); 94 95 /// <summary> 96 /// 查询一条语句返回结果集 97 /// </summary> 98 /// <param name="sqlQuery"></param> 99 /// <param name="paras"></param> 100 /// <returns></returns> 101 DbRawSqlQuery<T> SqlQuery(String sqlQuery, params object[] paras); 102 } 103 }
3.在ivw.Services类中新建一个BaseServices方法,写入以下代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using ivw.IDao; 2 using System; 3 using System.Collections.Generic; 4 using System.Data.Entity.Infrastructure; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace ivw.Services 10 { 11 public class BaseServices<T> where T : class 12 { 13 private readonly IBaseDao<T> baseDao; 14 public BaseServices(IBaseDao<T> baseDao) 15 { 16 this.baseDao = baseDao; 17 } 18 19 /// <summary> 20 /// 获取数据源 21 /// </summary> 22 /// <returns></returns> 23 public List<T> GetList() 24 { 25 return baseDao.GetList(); 26 } 27 28 /// <summary> 29 /// 插入一个实体 30 /// </summary> 31 /// <param name="model"></param> 32 /// <returns></returns> 33 public Boolean Create(T model) 34 { 35 return baseDao.Create(model) > 0; 36 } 37 38 /// <summary> 39 /// 批量插入一个实体 40 /// </summary> 41 /// <param name="models"></param> 42 /// <returns></returns> 43 public Boolean Create(List<T> models) 44 { 45 return baseDao.Create(models) > 0; 46 } 47 48 /// <summary> 49 /// 修改一个实体 50 /// </summary> 51 /// <param name="model"></param> 52 /// <returns></returns> 53 public Boolean Edit(T model) 54 { 55 return baseDao.Edit(model) > 0; 56 } 57 58 /// <summary> 59 /// 删除一个实体 60 /// </summary> 61 /// <param name="model"></param> 62 /// <returns></returns> 63 public Boolean Delete(T model) 64 { 65 return baseDao.Delete(model) > 0; 66 } 67 68 /// <summary> 69 /// 批量删除实体 70 /// </summary> 71 /// <param name="models"></param> 72 /// <returns></returns> 73 public Boolean Delete(List<T> models) 74 { 75 return baseDao.Delete(models) > 0; 76 } 77 78 /// <summary> 79 /// 删除主键实体 80 /// </summary> 81 /// <param name="KeyValues"></param> 82 /// <returns></returns> 83 public Boolean Delete(params object[] KeyValues) 84 { 85 return baseDao.Delete(KeyValues) > 0; 86 } 87 88 /// <summary> 89 /// 根据主键获取实体 90 /// </summary> 91 /// <param name="KeyValues"></param> 92 /// <returns></returns> 93 public T GetById(params object[] KeyValues) 94 { 95 return baseDao.GetById(KeyValues); 96 } 97 98 /// <summary> 99 /// 判断该实体是否存在 100 /// </summary> 101 /// <param name="id"></param> 102 /// <returns></returns> 103 public bool IsExist(object id) 104 { 105 return baseDao.IsExist(id); 106 } 107 108 /// <summary> 109 /// 执行一条SQL语句 110 /// </summary> 111 /// <param name="sqlQuery"></param> 112 /// <returns></returns> 113 public Boolean ExecuteSqlCommand(String sqlQuery) 114 { 115 return baseDao.ExecuteSqlCommand(sqlQuery) > 0; 116 } 117 118 /// <summary> 119 /// 异步执行一条SQL语句 120 /// </summary> 121 /// <param name="sqlQuery"></param> 122 /// <returns></returns> 123 public Task<int> ExecuteSqlCommandAsync(String sqlQuery) 124 { 125 return baseDao.ExecuteSqlCommandAsync(sqlQuery); 126 } 127 128 /// <summary> 129 /// 查询一条语句返回结果集 130 /// </summary> 131 /// <param name="sqlQuery"></param> 132 /// <returns></returns> 133 public DbRawSqlQuery<T> SqlQuery(String sqlQuery) 134 { 135 return baseDao.SqlQuery(sqlQuery); 136 } 137 138 /// <summary> 139 /// 查询一条语句返回结果集 140 /// </summary> 141 /// <param name="sqlQuery"></param> 142 /// <param name="paras"></param> 143 /// <returns></returns> 144 public DbRawSqlQuery<T> SqlQuery(String sqlQuery, params object[] paras) 145 { 146 return baseDao.SqlQuery(sqlQuery, paras); 147 } 148 } 149 }
4.我们新增一个Modules表,用来测试。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 USE [IVW] 2 GO 3 4 /****** Object: Table [dbo].[Modules] Script Date: 2017/11/25 20:34:36 ******/ 5 SET ANSI_NULLS ON 6 GO 7 8 SET QUOTED_IDENTIFIER ON 9 GO 10 11 CREATE TABLE [dbo].[Modules]( 12 [Id] [int] IDENTITY(1,1) NOT NULL, 13 [ModuleCode] [nvarchar](50) NULL, 14 [ModuleName] [nvarchar](256) NOT NULL, 15 [Description] [nvarchar](256) NULL, 16 [AssemblyName] [nvarchar](256) NULL, 17 [TypeName] [nvarchar](256) NULL, 18 [IsFolder] [bit] NOT NULL, 19 [Visible] [bit] NULL, 20 [ModuleSort] [int] NULL, 21 [ModuleIcon] [nvarchar](50) NULL, 22 [ParentId] [int] NULL, 23 CONSTRAINT [PK_Modules_1] PRIMARY KEY CLUSTERED 24 ( 25 [Id] ASC 26 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 27 ) ON [PRIMARY] 28 GO 29 30 ALTER TABLE [dbo].[Modules] ADD CONSTRAINT [DF_Modules_IsFolder] DEFAULT ((0)) FOR [IsFolder] 31 GO 32 33 ALTER TABLE [dbo].[Modules] ADD CONSTRAINT [DF_Modules_Visible] DEFAULT ((1)) FOR [Visible] 34 GO 35 36 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'Id' 37 GO 38 39 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块代码' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'ModuleCode' 40 GO 41 42 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'ModuleName' 43 GO 44 45 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'描述' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'Description' 46 GO 47 48 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'程序集' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'AssemblyName' 49 GO 50 51 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'对象类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'TypeName' 52 GO 53 54 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否为组' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'IsFolder' 55 GO 56 57 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否功能可见' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'Visible' 58 GO 59 60 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'排序' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'ModuleSort' 61 GO 62 63 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'父ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Modules', @level2type=N'COLUMN',@level2name=N'ParentId' 64 GO
5.然后插入几条数据。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 USE [IVW] 2 GO 3 SET IDENTITY_INSERT [dbo].[Modules] ON 4 GO 5 INSERT [dbo].[Modules] ([Id], [ModuleCode], [ModuleName], [Description], [AssemblyName], [TypeName], [IsFolder], [Visible], [ModuleSort], [ModuleIcon], [ParentId]) VALUES (0, N'Module', N'系统模块', NULL, NULL, NULL, 1, 1, NULL, NULL, NULL) 6 GO 7 INSERT [dbo].[Modules] ([Id], [ModuleCode], [ModuleName], [Description], [AssemblyName], [TypeName], [IsFolder], [Visible], [ModuleSort], [ModuleIcon], [ParentId]) VALUES (1, N'Sys', N'系统管理', NULL, NULL, N'', 1, 1, 1, NULL, 0) 8 GO 9 INSERT [dbo].[Modules] ([Id], [ModuleCode], [ModuleName], [Description], [AssemblyName], [TypeName], [IsFolder], [Visible], [ModuleSort], [ModuleIcon], [ParentId]) VALUES (2, N'User', N'个人办公', N'', N'', N'', 1, 1, 2, N'', 0) 10 GO 11 INSERT [dbo].[Modules] ([Id], [ModuleCode], [ModuleName], [Description], [AssemblyName], [TypeName], [IsFolder], [Visible], [ModuleSort], [ModuleIcon], [ParentId]) VALUES (3, N'Modules', N'系统模块管理', N'', N'', N'ivw.Windows.frmModules', 0, 1, 1, N'', 1) 12 GO 13 INSERT [dbo].[Modules] ([Id], [ModuleCode], [ModuleName], [Description], [AssemblyName], [TypeName], [IsFolder], [Visible], [ModuleSort], [ModuleIcon], [ParentId]) VALUES (6, N'txl', N'我的联系人', N'', N'', N'ivw.Windows.frmContact', 0, 1, 2, N'', 2) 14 GO 15 SET IDENTITY_INSERT [dbo].[Modules] OFF 16 GO
6.在实体类中更新Modules实体,在ivw.Dao中新建ModulesDao,ivw.IDao中新建IModulesDao,ivw.Services新建ModulesServices。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using ivw.IDao; 8 using ivw.Models; 9 10 namespace ivw.Dao.SqlServer 11 { 12 public class ModulesDao : BaseDao<Modules>, IModulesDao 13 { 14 15 } 16 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using ivw.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ivw.IDao 9 { 10 public interface IModulesDao : IBaseDao<Modules> 11 { 12 13 } 14 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using ivw.IDao; 8 using ivw.Models.Sys; 9 using ivw.Models; 10 11 namespace ivw.Services 12 { 13 public class ModulesServices : BaseServices<Modules> 14 { 15 private readonly IModulesDao modulesDao; 16 public ModulesServices(IModulesDao modulesDao) 17 : base(modulesDao) 18 { 19 this.modulesDao = modulesDao; 20 } 21 } 22 }
7.注册。
(1)在ivw.Unity中ModulesServices方法加入以下代码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 builder.RegisterType<Dao.SqlServer.ModulesDao>().As<IDao.IModulesDao>();//注册菜单
(2)在ServiceHelper中加入以下代码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using ivw.Services; 2 using ivw.IDao; 3 namespace ivw.Unity 4 { 5 public static class ServiceHelper 6 { 7 #region 公共属性 8 public static UserServices UserServices { get; set; } 9 public static ModulesServices ModulesServices { get; set; } 10 #endregion 11 12 static ServiceHelper() => SetService(); 13 14 #region 设置Service值 15 public static void SetService() 16 { 17 UserServices = new UserServices(AutofacContainer.GetInstance().GetObject<IUserDao>()); 18 ModulesServices = new ModulesServices(AutofacContainer.GetInstance().GetObject<IModulesDao>()); 19 } 20 #endregion 21 } 22 }
8.新建一个frmModules窗体,至于布局随便弄,以下是我自己布局的界面。(新增一个DevExpress的TreeList)
9.在ivw.Windows中新建一个文件夹Common,里面新增一个xTreeList类,为公用方法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using DevExpress.XtraTreeList.Columns; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ivw.Windows 9 { 10 public class xTreeList 11 { 12 public static void AddxTreeListColumns(DevExpress.XtraTreeList.TreeList TreeList, String Caption, String FieldName, String Name, int Width, Boolean Visible) 13 { 14 TreeListColumn treeListColumn = new TreeListColumn 15 { 16 Caption = Caption, 17 FieldName = FieldName, 18 Name = Name, 19 Width = Width, 20 Visible= Visible 21 }; 22 TreeList.Columns.Add(treeListColumn); 23 } 24 25 public static void SetTreeList(DevExpress.XtraTreeList.TreeList TreeList,String KeyFieldName,String ParentFieldName) 26 { 27 TreeList.KeyFieldName = KeyFieldName; 28 TreeList.ParentFieldName = ParentFieldName; 29 30 TreeList.OptionsBehavior.ReadOnly = true;//设置只读 31 TreeList.OptionsBehavior.Editable = false;//设置不可编辑 32 TreeList.OptionsBehavior.AutoSelectAllInEditor = false;//设置是否允许通过Enter或F2来选择该单元格的所有内容。 33 34 TreeList.OptionsSelection.InvertSelection = true;//聚焦的样式是否只适用于聚焦细胞或所有细胞除了聚焦对象,失去焦点后 35 //TreeList.OptionsFilter.AllowColumnMRUFilterList = false;//过滤器不显示最近过滤的项目 36 //TreeList.OptionsFilter.AllowFilterEditor = false;//不允许使用过滤编辑器 37 //TreeList.OptionsFilter.AllowMRUFilterList = false;//不允许使用最近使用项目的过滤列表 38 39 TreeList.OptionsView.AutoWidth = true;//允许自动列宽 40 41 } 42 } 43 }
10.回到frmModules后台写入以下代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Linq; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using DevExpress.XtraEditors; 11 using ivw.Models; 12 using ivw.Unity; 13 using DevExpress.XtraTreeList.Nodes; 14 using DevExpress.XtraTreeList.Columns; 15 16 namespace ivw.Windows 17 { 18 public partial class frmModules : BaseForm 19 { 20 public frmModules() 21 { 22 InitializeComponent(); 23 this.Load += FrmModules_Load; 24 } 25 26 private void FrmModules_Load(object sender, EventArgs e) 27 { 28 this.tlModules.Nodes.Clear(); 29 xTreeList.AddxTreeListColumns(tlModules, "模块列表", "ModuleName", "ModuleName", 0, true); 30 xTreeList.SetTreeList(tlModules, "Id", "ParentId"); 31 32 List<Modules> list = ServiceHelper.ModulesServices.GetList(); 33 this.tlModules.DataSource = new BindingList<Modules>(list); 34 this.tlModules.ExpandAll();//默认展开 35 } 36 } 37 }
11.BaseFrom代码为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows.Forms; 7 8 namespace ivw.Windows 9 { 10 public class BaseForm : DevExpress.XtraEditors.XtraForm 11 { 12 public BaseForm() 13 { 14 this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 15 UpdateStyles(); 16 } 17 } 18 }
12.我们来看一下效果如何。
13.泛型派生类使用成功了哟!😊
地沟油:未经同意,禁止转载。否则追究法律责任!