(四十七)c#Winform自定义控件-树表格(treeGrid)
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
github:https://github.com/kwwwvagaa/netwinformcontrol
码云:
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492
麻烦博客下方点个【推荐】,谢谢
nuget
install-package hzh_controls
目录
用处及效果
准备工作
这个是在前面表格的基础上,扩展了自定义行实现的,当然也修改了一些列表控件以兼容
如果对前面的表格控件不了解,请移步查看
开始
实现树表格的思路就是,在行控件中再添加一个无标题的表格控件,当需要显示子节点的时候,将子节点数据加载到行里的表格控件中,然后处理一下事件,让事件可以穿透到最顶层就行了。
另外我们前面表格中的行个数是根据高度大小自动计算的,这里就会出现问题,当出现子节点表格的时候,就会导致重算个数和高度,所有我们在表格列表控件增加一个属性来禁用这个自动计算。
添加一个用户控件,命名ucdatagridviewtreerow,实现接口idatagridviewrow
属性
1 #region 属性 2 public event datagridvieweventhandler checkboxchangeevent; 3 4 public event datagridvieweventhandler cellclick; 5 6 public event datagridvieweventhandler sourcechanged; 7 8 public list<datagridviewcolumnentity> columns 9 { 10 get; 11 set; 12 } 13 14 public object datasource 15 { 16 get; 17 set; 18 } 19 20 public bool isshowcheckbox 21 { 22 get; 23 set; 24 } 25 private bool m_ischecked; 26 public bool ischecked 27 { 28 get 29 { 30 return m_ischecked; 31 } 32 33 set 34 { 35 if (m_ischecked != value) 36 { 37 m_ischecked = value; 38 (this.pancells.controls.find("check", false)[0] as uccheckbox).checked = value; 39 } 40 } 41 } 42 43 int m_rowheight = 40; 44 public int rowheight 45 { 46 get 47 { 48 return m_rowheight; 49 } 50 set 51 { 52 m_rowheight = value; 53 this.height = value; 54 } 55 } 56 #endregion
构造函数处理一写东西,注意 this.ucdgvchild.itemclick ,这个是将子节点表格的点击事件向上传递
1 public ucdatagridviewtreerow() 2 { 3 initializecomponent(); 4 this.ucdgvchild.rowtype = this.gettype(); 5 this.ucdgvchild.isautoheight = true; 6 this.sizechanged += ucdatagridviewtreerow_sizechanged; 7 this.ucdgvchild.itemclick += (a, b) => 8 { 9 if (cellclick != null) 10 { 11 cellclick(a, new datagridvieweventargs() 12 { 13 cellcontrol = (a as control), 14 cellindex = (a as control).tag.toint() 15 }); 16 } 17 }; 18 19 }
实现接口函数bindingcelldata,主要处理一下数据绑定后将子节点数据向下传递
1 public void bindingcelldata() 2 { 3 for (int i = 0; i < columns.count; i++) 4 { 5 datagridviewcolumnentity com = columns[i]; 6 var cs = this.pancells.controls.find("lbl_" + com.datafield, false); 7 if (cs != null && cs.length > 0) 8 { 9 var pro = datasource.gettype().getproperty(com.datafield); 10 if (pro != null) 11 { 12 var value = pro.getvalue(datasource, null); 13 if (com.format != null) 14 { 15 cs[0].text = com.format(value); 16 } 17 else 18 { 19 cs[0].text = value.tostringext(); 20 } 21 } 22 } 23 } 24 panleft.tag = 0; 25 var prochildrens = datasource.gettype().getproperty("childrens"); 26 if (prochildrens != null) 27 { 28 var value = prochildrens.getvalue(datasource, null); 29 if (value != null) 30 { 31 int intsourcecount = 0; 32 if (value is datatable) 33 { 34 intsourcecount = (value as datatable).rows.count; 35 } 36 else if (typeof(ilist).isassignablefrom(value.gettype())) 37 { 38 intsourcecount = (value as ilist).count; 39 } 40 if (intsourcecount > 0) 41 { 42 panleft.backgroundimage = properties.resources.caret_right; 43 panleft.enabled = true; 44 panchildgrid.tag = value; 45 } 46 else 47 { 48 panleft.backgroundimage = null; 49 panleft.enabled = false; 50 panchildgrid.tag = null; 51 } 52 } 53 else 54 { 55 panleft.backgroundimage = null; 56 panleft.enabled = false; 57 panchildgrid.tag = null; 58 } 59 } 60 else 61 { 62 panleft.backgroundimage = null; 63 panleft.enabled = false; 64 panchildgrid.tag = null; 65 } 66 }
实现函数绑定列
1 public void reloadcells() 2 { 3 try 4 { 5 controlhelper.freezecontrol(this, true); 6 this.pancells.controls.clear(); 7 this.pancells.columnstyles.clear(); 8 9 int intcolumnscount = columns.count(); 10 if (columns != null && intcolumnscount > 0) 11 { 12 if (isshowcheckbox) 13 { 14 intcolumnscount++; 15 } 16 this.pancells.columncount = intcolumnscount; 17 for (int i = 0; i < intcolumnscount; i++) 18 { 19 control c = null; 20 if (i == 0 && isshowcheckbox) 21 { 22 this.pancells.columnstyles.add(new system.windows.forms.columnstyle(sizetype.absolute, 30f)); 23 24 uccheckbox box = new uccheckbox(); 25 box.name = "check"; 26 box.textvalue = ""; 27 box.size = new size(30, 30); 28 box.dock = dockstyle.fill; 29 box.checkedchangeevent += (a, b) => 30 { 31 ischecked = box.checked; 32 this.ucdgvchild.rows.foreach(p => p.ischecked = box.checked); 33 if (checkboxchangeevent != null) 34 { 35 checkboxchangeevent(a, new datagridvieweventargs() 36 { 37 cellcontrol = box, 38 cellindex = 0 39 }); 40 } 41 }; 42 c = box; 43 } 44 else 45 { 46 var item = columns[i - (isshowcheckbox ? 1 : 0)]; 47 this.pancells.columnstyles.add(new system.windows.forms.columnstyle(item.widthtype, item.width)); 48 49 label lbl = new label(); 50 lbl.tag = i - (isshowcheckbox ? 1 : 0); 51 lbl.name = "lbl_" + item.datafield; 52 lbl.font = new font("微软雅黑", 12); 53 lbl.forecolor = color.black; 54 lbl.autosize = false; 55 lbl.dock = dockstyle.fill; 56 lbl.textalign = contentalignment.middlecenter; 57 lbl.mousedown += (a, b) => 58 { 59 item_mousedown(a, b); 60 }; 61 c = lbl; 62 } 63 this.pancells.controls.add(c, i, 0); 64 } 65 66 } 67 } 68 finally 69 { 70 controlhelper.freezecontrol(this, false); 71 } 72 }
当点击展开图标的时候处理子节点的数据绑定以及高度计算
1 private void panleft_mousedown(object sender, mouseeventargs e) 2 { 3 try 4 { 5 controlhelper.freezecontrol(this.findform(), true); 6 if (panleft.tag.toint() == 0) 7 { 8 var value = panchildgrid.tag; 9 if (value != null) 10 { 11 panleft.backgroundimage = properties.resources.caret_down; 12 panleft.tag = 1; 13 int intsourcecount = 0; 14 if (value is datatable) 15 { 16 intsourcecount = (value as datatable).rows.count; 17 } 18 else if (typeof(ilist).isassignablefrom(value.gettype())) 19 { 20 intsourcecount = (value as ilist).count; 21 } 22 this.panchildgrid.height = rowheight * intsourcecount; 23 if (panchildgrid.height > 0) 24 { 25 if (value != this.ucdgvchild.datasource) 26 { 27 this.ucdgvchild.columns = columns; 28 this.ucdgvchild.rowheight = rowheight; 29 this.ucdgvchild.headpadingleft = this.panleft.width; 30 this.ucdgvchild.isshowcheckbox = isshowcheckbox; 31 this.ucdgvchild.datasource = value; 32 this.ucdgvchild.rows.foreach(p => p.ischecked =this.ischecked); 33 } 34 } 35 } 36 37 } 38 else 39 { 40 panleft.tag = 0; 41 panchildgrid.height = 0; 42 panleft.backgroundimage = properties.resources.caret_right; 43 } 44 } 45 finally 46 { 47 controlhelper.freezecontrol(this.findform(), false); 48 } 49 }
承载子节点表格的panel 在大小改变的时候,处理父级表格的大小。来防止出现多个滚动条
1 void ucdatagridviewtreerow_sizechanged(object sender, eventargs e) 2 { 3 if (this.parent.parent.parent != null && this.parent.parent.parent.name == "panchildgrid" && this.panleft.tag.toint() == 1) 4 { 5 int intheight = this.parent.parent.controls[0].controls.toarray().sum(p => p.height); 6 if (this.parent.parent.parent.height != intheight) 7 this.parent.parent.parent.height = intheight; 8 } 9 }
完整代码
1 using system; 2 using system.collections.generic; 3 using system.componentmodel; 4 using system.drawing; 5 using system.data; 6 using system.linq; 7 using system.text; 8 using system.windows.forms; 9 using system.collections; 10 11 namespace hzh_controls.controls 12 { 13 [toolboxitem(false)] 14 public partial class ucdatagridviewtreerow : usercontrol, idatagridviewrow 15 { 16 #region 属性 17 public event datagridvieweventhandler checkboxchangeevent; 18 19 public event datagridvieweventhandler cellclick; 20 21 public event datagridvieweventhandler sourcechanged; 22 23 public list<datagridviewcolumnentity> columns 24 { 25 get; 26 set; 27 } 28 29 public object datasource 30 { 31 get; 32 set; 33 } 34 35 public bool isshowcheckbox 36 { 37 get; 38 set; 39 } 40 private bool m_ischecked; 41 public bool ischecked 42 { 43 get 44 { 45 return m_ischecked; 46 } 47 48 set 49 { 50 if (m_ischecked != value) 51 { 52 m_ischecked = value; 53 (this.pancells.controls.find("check", false)[0] as uccheckbox).checked = value; 54 } 55 } 56 } 57 58 int m_rowheight = 40; 59 public int rowheight 60 { 61 get 62 { 63 return m_rowheight; 64 } 65 set 66 { 67 m_rowheight = value; 68 this.height = value; 69 } 70 } 71 #endregion 72 73 public ucdatagridviewtreerow() 74 { 75 initializecomponent(); 76 this.ucdgvchild.rowtype = this.gettype(); 77 this.ucdgvchild.isautoheight = true; 78 this.sizechanged += ucdatagridviewtreerow_sizechanged; 79 this.ucdgvchild.itemclick += (a, b) => 80 { 81 if (cellclick != null) 82 { 83 cellclick(a, new datagridvieweventargs() 84 { 85 cellcontrol = (a as control), 86 cellindex = (a as control).tag.toint() 87 }); 88 } 89 }; 90 91 } 92 93 void ucdatagridviewtreerow_sizechanged(object sender, eventargs e) 94 { 95 if (this.parent.parent.parent != null && this.parent.parent.parent.name == "panchildgrid" && this.panleft.tag.toint() == 1) 96 { 97 int intheight = this.parent.parent.controls[0].controls.toarray().sum(p => p.height); 98 if (this.parent.parent.parent.height != intheight) 99 this.parent.parent.parent.height = intheight; 100 } 101 } 102 103 104 public void bindingcelldata() 105 { 106 for (int i = 0; i < columns.count; i++) 107 { 108 datagridviewcolumnentity com = columns[i]; 109 var cs = this.pancells.controls.find("lbl_" + com.datafield, false); 110 if (cs != null && cs.length > 0) 111 { 112 var pro = datasource.gettype().getproperty(com.datafield); 113 if (pro != null) 114 { 115 var value = pro.getvalue(datasource, null); 116 if (com.format != null) 117 { 118 cs[0].text = com.format(value); 119 } 120 else 121 { 122 cs[0].text = value.tostringext(); 123 } 124 } 125 } 126 } 127 panleft.tag = 0; 128 var prochildrens = datasource.gettype().getproperty("childrens"); 129 if (prochildrens != null) 130 { 131 var value = prochildrens.getvalue(datasource, null); 132 if (value != null) 133 { 134 int intsourcecount = 0; 135 if (value is datatable) 136 { 137 intsourcecount = (value as datatable).rows.count; 138 } 139 else if (typeof(ilist).isassignablefrom(value.gettype())) 140 { 141 intsourcecount = (value as ilist).count; 142 } 143 if (intsourcecount > 0) 144 { 145 panleft.backgroundimage = properties.resources.caret_right; 146 panleft.enabled = true; 147 panchildgrid.tag = value; 148 } 149 else 150 { 151 panleft.backgroundimage = null; 152 panleft.enabled = false; 153 panchildgrid.tag = null; 154 } 155 } 156 else 157 { 158 panleft.backgroundimage = null; 159 panleft.enabled = false; 160 panchildgrid.tag = null; 161 } 162 } 163 else 164 { 165 panleft.backgroundimage = null; 166 panleft.enabled = false; 167 panchildgrid.tag = null; 168 } 169 } 170 171 void item_mousedown(object sender, mouseeventargs e) 172 { 173 if (cellclick != null) 174 { 175 cellclick(this, new datagridvieweventargs() 176 { 177 cellcontrol = this, 178 cellindex = (sender as control).tag.toint() 179 }); 180 } 181 } 182 183 public void setselect(bool blnselected) 184 { 185 if (blnselected) 186 { 187 this.panmain.backcolor = color.fromargb(255, 247, 245); 188 } 189 else 190 { 191 this.panmain.backcolor = color.transparent; 192 } 193 } 194 195 public void reloadcells() 196 { 197 try 198 { 199 controlhelper.freezecontrol(this, true); 200 this.pancells.controls.clear(); 201 this.pancells.columnstyles.clear(); 202 203 int intcolumnscount = columns.count(); 204 if (columns != null && intcolumnscount > 0) 205 { 206 if (isshowcheckbox) 207 { 208 intcolumnscount++; 209 } 210 this.pancells.columncount = intcolumnscount; 211 for (int i = 0; i < intcolumnscount; i++) 212 { 213 control c = null; 214 if (i == 0 && isshowcheckbox) 215 { 216 this.pancells.columnstyles.add(new system.windows.forms.columnstyle(sizetype.absolute, 30f)); 217 218 uccheckbox box = new uccheckbox(); 219 box.name = "check"; 220 box.textvalue = ""; 221 box.size = new size(30, 30); 222 box.dock = dockstyle.fill; 223 box.checkedchangeevent += (a, b) => 224 { 225 ischecked = box.checked; 226 this.ucdgvchild.rows.foreach(p => p.ischecked = box.checked); 227 if (checkboxchangeevent != null) 228 { 229 checkboxchangeevent(a, new datagridvieweventargs() 230 { 231 cellcontrol = box, 232 cellindex = 0 233 }); 234 } 235 }; 236 c = box; 237 } 238 else 239 { 240 var item = columns[i - (isshowcheckbox ? 1 : 0)]; 241 this.pancells.columnstyles.add(new system.windows.forms.columnstyle(item.widthtype, item.width)); 242 243 label lbl = new label(); 244 lbl.tag = i - (isshowcheckbox ? 1 : 0); 245 lbl.name = "lbl_" + item.datafield; 246 lbl.font = new font("微软雅黑", 12); 247 lbl.forecolor = color.black; 248 lbl.autosize = false; 249 lbl.dock = dockstyle.fill; 250 lbl.textalign = contentalignment.middlecenter; 251 lbl.mousedown += (a, b) => 252 { 253 item_mousedown(a, b); 254 }; 255 c = lbl; 256 } 257 this.pancells.controls.add(c, i, 0); 258 } 259 260 } 261 } 262 finally 263 { 264 controlhelper.freezecontrol(this, false); 265 } 266 } 267 268 private void panchildgrid_sizechanged(object sender, eventargs e) 269 { 270 int intheight = rowheight + panchildgrid.height; 271 if (panchildgrid.height != 0) 272 this.ucdgvchild.height = panchildgrid.height; 273 if (this.height != intheight) 274 this.height = intheight; 275 } 276 277 private void panleft_mousedown(object sender, mouseeventargs e) 278 { 279 try 280 { 281 controlhelper.freezecontrol(this.findform(), true); 282 if (panleft.tag.toint() == 0) 283 { 284 var value = panchildgrid.tag; 285 if (value != null) 286 { 287 panleft.backgroundimage = properties.resources.caret_down; 288 panleft.tag = 1; 289 int intsourcecount = 0; 290 if (value is datatable) 291 { 292 intsourcecount = (value as datatable).rows.count; 293 } 294 else if (typeof(ilist).isassignablefrom(value.gettype())) 295 { 296 intsourcecount = (value as ilist).count; 297 } 298 this.panchildgrid.height = rowheight * intsourcecount; 299 if (panchildgrid.height > 0) 300 { 301 if (value != this.ucdgvchild.datasource) 302 { 303 this.ucdgvchild.columns = columns; 304 this.ucdgvchild.rowheight = rowheight; 305 this.ucdgvchild.headpadingleft = this.panleft.width; 306 this.ucdgvchild.isshowcheckbox = isshowcheckbox; 307 this.ucdgvchild.datasource = value; 308 this.ucdgvchild.rows.foreach(p => p.ischecked =this.ischecked); 309 } 310 } 311 } 312 313 } 314 else 315 { 316 panleft.tag = 0; 317 panchildgrid.height = 0; 318 panleft.backgroundimage = properties.resources.caret_right; 319 } 320 } 321 finally 322 { 323 controlhelper.freezecontrol(this.findform(), false); 324 } 325 } 326 327 private void ucdgvchild_sizechanged(object sender, eventargs e) 328 { 329 330 } 331 } 332 }
1 namespace hzh_controls.controls 2 { 3 partial class ucdatagridviewtreerow 4 { 5 /// <summary> 6 /// 必需的设计器变量。 7 /// </summary> 8 private system.componentmodel.icontainer components = null; 9 10 /// <summary> 11 /// 清理所有正在使用的资源。 12 /// </summary> 13 /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> 14 protected override void dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.dispose(); 19 } 20 base.dispose(disposing); 21 } 22 23 #region 组件设计器生成的代码 24 25 /// <summary> 26 /// 设计器支持所需的方法 - 不要 27 /// 使用代码编辑器修改此方法的内容。 28 /// </summary> 29 private void initializecomponent() 30 { 31 this.pancells = new system.windows.forms.tablelayoutpanel(); 32 this.panleft = new system.windows.forms.panel(); 33 this.panchildgrid = new system.windows.forms.panel(); 34 this.panchildleft = new system.windows.forms.panel(); 35 this.panmain = new system.windows.forms.panel(); 36 this.ucsplitline_h1 = new hzh_controls.controls.ucsplitline_h(); 37 this.ucdgvchild = new hzh_controls.controls.ucdatagridview(); 38 this.ucsplitline_v1 = new hzh_controls.controls.ucsplitline_v(); 39 this.panchildgrid.suspendlayout(); 40 this.panmain.suspendlayout(); 41 this.suspendlayout(); 42 // 43 // pancells 44 // 45 this.pancells.columncount = 1; 46 this.pancells.columnstyles.add(new system.windows.forms.columnstyle(system.windows.forms.sizetype.percent, 100f)); 47 this.pancells.columnstyles.add(new system.windows.forms.columnstyle(system.windows.forms.sizetype.absolute, 20f)); 48 this.pancells.dock = system.windows.forms.dockstyle.fill; 49 this.pancells.location = new system.drawing.point(24, 0); 50 this.pancells.name = "pancells"; 51 this.pancells.rowcount = 1; 52 this.pancells.rowstyles.add(new system.windows.forms.rowstyle(system.windows.forms.sizetype.percent, 100f)); 53 this.pancells.rowstyles.add(new system.windows.forms.rowstyle(system.windows.forms.sizetype.absolute, 55f)); 54 this.pancells.size = new system.drawing.size(637, 64); 55 this.pancells.tabindex = 2; 56 // 57 // panleft 58 // 59 this.panleft.backgroundimagelayout = system.windows.forms.imagelayout.center; 60 this.panleft.dock = system.windows.forms.dockstyle.left; 61 this.panleft.location = new system.drawing.point(0, 0); 62 this.panleft.name = "panleft"; 63 this.panleft.size = new system.drawing.size(24, 64); 64 this.panleft.tabindex = 0; 65 this.panleft.tag = "0"; 66 this.panleft.mousedown += new system.windows.forms.mouseeventhandler(this.panleft_mousedown); 67 // 68 // panchildgrid 69 // 70 this.panchildgrid.controls.add(this.ucdgvchild); 71 this.panchildgrid.controls.add(this.ucsplitline_v1); 72 this.panchildgrid.controls.add(this.panchildleft); 73 this.panchildgrid.dock = system.windows.forms.dockstyle.bottom; 74 this.panchildgrid.location = new system.drawing.point(0, 65); 75 this.panchildgrid.name = "panchildgrid"; 76 this.panchildgrid.size = new system.drawing.size(661, 0); 77 this.panchildgrid.tabindex = 0; 78 this.panchildgrid.sizechanged += new system.eventhandler(this.panchildgrid_sizechanged); 79 // 80 // panchildleft 81 // 82 this.panchildleft.backgroundimagelayout = system.windows.forms.imagelayout.center; 83 this.panchildleft.dock = system.windows.forms.dockstyle.left; 84 this.panchildleft.location = new system.drawing.point(0, 0); 85 this.panchildleft.name = "panchildleft"; 86 this.panchildleft.size = new system.drawing.size(24, 0); 87 this.panchildleft.tabindex = 1; 88 this.panchildleft.tag = "0"; 89 // 90 // panmain 91 // 92 this.panmain.controls.add(this.pancells); 93 this.panmain.controls.add(this.panleft); 94 this.panmain.dock = system.windows.forms.dockstyle.fill; 95 this.panmain.location = new system.drawing.point(0, 0); 96 this.panmain.name = "panmain"; 97 this.panmain.size = new system.drawing.size(661, 64); 98 this.panmain.tabindex = 0; 99 // 100 // ucsplitline_h1 101 // 102 this.ucsplitline_h1.backcolor = system.drawing.color.fromargb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); 103 this.ucsplitline_h1.dock = system.windows.forms.dockstyle.bottom; 104 this.ucsplitline_h1.location = new system.drawing.point(0, 64); 105 this.ucsplitline_h1.name = "ucsplitline_h1"; 106 this.ucsplitline_h1.size = new system.drawing.size(661, 1); 107 this.ucsplitline_h1.tabindex = 1; 108 this.ucsplitline_h1.tabstop = false; 109 // 110 // ucdgvchild 111 // 112 this.ucdgvchild.anchor = ((system.windows.forms.anchorstyles)(((system.windows.forms.anchorstyles.top | system.windows.forms.anchorstyles.left) 113 | system.windows.forms.anchorstyles.right))); 114 this.ucdgvchild.backcolor = system.drawing.color.white; 115 this.ucdgvchild.headfont = new system.drawing.font("微软雅黑", 12f); 116 this.ucdgvchild.headheight = 40; 117 this.ucdgvchild.headpadingleft = 0; 118 this.ucdgvchild.headtextcolor = system.drawing.color.black; 119 this.ucdgvchild.isautoheight = false; 120 this.ucdgvchild.isshowcheckbox = false; 121 this.ucdgvchild.isshowhead = false; 122 this.ucdgvchild.location = new system.drawing.point(25, 0); 123 this.ucdgvchild.name = "ucdgvchild"; 124 this.ucdgvchild.page = null; 125 this.ucdgvchild.rowheight = 40; 126 this.ucdgvchild.rowtype = typeof(hzh_controls.controls.ucdatagridviewrow); 127 this.ucdgvchild.size = new system.drawing.size(636, 100); 128 this.ucdgvchild.tabindex = 0; 129 this.ucdgvchild.sizechanged += new system.eventhandler(this.ucdgvchild_sizechanged); 130 // 131 // ucsplitline_v1 132 // 133 this.ucsplitline_v1.backcolor = system.drawing.color.fromargb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); 134 this.ucsplitline_v1.dock = system.windows.forms.dockstyle.left; 135 this.ucsplitline_v1.location = new system.drawing.point(24, 0); 136 this.ucsplitline_v1.name = "ucsplitline_v1"; 137 this.ucsplitline_v1.size = new system.drawing.size(1, 0); 138 this.ucsplitline_v1.tabindex = 0; 139 this.ucsplitline_v1.tabstop = false; 140 // 141 // ucdatagridviewtreerow 142 // 143 this.autoscalemode = system.windows.forms.autoscalemode.none; 144 this.backcolor = system.drawing.color.white; 145 this.controls.add(this.panmain); 146 this.controls.add(this.ucsplitline_h1); 147 this.controls.add(this.panchildgrid); 148 this.name = "ucdatagridviewtreerow"; 149 this.size = new system.drawing.size(661, 65); 150 this.panchildgrid.resumelayout(false); 151 this.panmain.resumelayout(false); 152 this.resumelayout(false); 153 154 } 155 156 #endregion 157 158 private system.windows.forms.tablelayoutpanel pancells; 159 private ucsplitline_h ucsplitline_h1; 160 private system.windows.forms.panel panleft; 161 private system.windows.forms.panel panchildgrid; 162 private ucdatagridview ucdgvchild; 163 private system.windows.forms.panel panchildleft; 164 private system.windows.forms.panel panmain; 165 private ucsplitline_v ucsplitline_v1; 166 } 167 }
我这里写死了,如果要使用树表格的话,子数据就要用属性childrens,比如下面的实体就是了
public class testmodel { public string id { get; set; } public string name { get; set; } public int age { get; set; } public datetime birthday { get; set; } public int sex { get; set; } public list<testmodel> childrens { get; set; } }
使用实例如下
1 this.ucdatagridview1.rowtype = typeof(ucdatagridviewtreerow); 2 this.ucdatagridview1.isautoheight = true; 3 4 list<datagridviewcolumnentity> lstculumns = new list<datagridviewcolumnentity>(); 5 lstculumns.add(new datagridviewcolumnentity() { datafield = "id", headtext = "编号", width = 70, widthtype = sizetype.absolute }); 6 lstculumns.add(new datagridviewcolumnentity() { datafield = "name", headtext = "姓名", width = 50, widthtype = sizetype.percent }); 7 lstculumns.add(new datagridviewcolumnentity() { datafield = "age", headtext = "年龄", width = 50, widthtype = sizetype.percent }); 8 lstculumns.add(new datagridviewcolumnentity() { datafield = "birthday", headtext = "生日", width = 50, widthtype = sizetype.percent, format = (a) => { return ((datetime)a).tostring("yyyy-mm-dd"); } }); 9 lstculumns.add(new datagridviewcolumnentity() { datafield = "sex", headtext = "性别", width = 50, widthtype = sizetype.percent, format = (a) => { return ((int)a) == 0 ? "女" : "男"; } }); 10 this.ucdatagridview1.columns = lstculumns; 11 this.ucdatagridview1.isshowcheckbox = true; 12 list<object> lstsource = new list<object>(); 13 for (int i = 0; i < 200; i++) 14 { 15 testmodel model = new testmodel() 16 { 17 id = i.tostring(), 18 age = 3 * i, 19 name = "姓名——" + i, 20 birthday = datetime.now.addyears(-10), 21 sex = i % 2 22 }; 23 lstsource.add(model); 24 addchilds(model, 5); 25 } 26 27 var page = new ucpagercontrol2(); 28 page.datasource = lstsource; 29 this.ucdatagridview1.page = page; 30 this.ucdatagridview1.first(); 31 32 33 34 35 private void addchilds(testmodel tm, int intcount) 36 { 37 if (intcount <= 0) 38 return; 39 tm.childrens = new list<testmodel>(); 40 for (int i = 0; i < 5; i++) 41 { 42 testmodel model = new testmodel() 43 { 44 id = i.tostring(), 45 age = 3 * i, 46 name = intcount + "——" + i, 47 birthday = datetime.now.addyears(-10), 48 sex = i % 2 49 }; 50 tm.childrens.add(model); 51 addchilds(model, intcount - 1); 52 } 53 }
最后的话
如果你喜欢的话,请到 点个星星吧
上一篇: Php开源项目大全
下一篇: php中计算时间差的几种方法