2023年6月22日发(作者:)
Winform组合ComboBox和TreeView实现ComboTreeView最近做Winform项⽬需要⽤到类似ComboBox的TreeView控件。虽然各种第三⽅控件很多,但是存在各种版本不兼容问题。所以⾃⼰写了个简单的ComboTreeView控件。下图是实现效果:⽬前实现的⽐较简单,能满⾜我项⽬中的需求。此处是项⽬中的代码简化后的版本,供⼤家参考。 1 using System; 2 using c; 3 using ; 4
5 namespace 6 { 7 public abstract class ComboTreeView
11 protected TreeView treeView; 12 protected ToolStripControlHost treeViewHost; 13 protected ToolStripDropDown dropDown; 14 protected bool dropDownOpen = false; 15 protected TreeNode selectedNode; 16 protected T toBeSelected; 17
18 public ComboTreeView(TreeView internalTreeView) 19 { 20 if (null == internalTreeView) 21 { 22 throw new ArgumentNullException("internalTreeView"); 23 } 24 lizeControls(internalTreeView); 25 } 26
27 public event TreeNodeChangedEventHandler TreeNodeChanged; 28
29 protected virtual void InitializeControls(TreeView internalTreeView) 30 { 31 ew = internalTreeView; 32 Style = ingle; 33 = new Padding(0); 34 g = new Padding(0); 35 xpand += new TreeViewEventHandler(terExpand); 36
37 ewHost = new ToolStripControlHost(ew); 38 = new Padding(0); 39 g = new Padding(0); 40 ze = false; 41
42 wn = new ToolStripDropDown(); 43 = new Padding(0); 44 g = new Padding(0); 45 ze = false; 46 adowEnabled = true; 47 (ewHost); 48 += new ToolStripDropDownClosedEventHandler(DownClosed); 49
50 wnWidth = ; 51 wnStyle = wnList; 52 anged += new EventHandler(mboboxSizeChanged); 53 } 54
55 public new ComboBoxStyle DropDownStyle 56 { 57 get { return wnStyle; } 58 set { wnStyle = wnList; } 59 } 60
61 public virtual TreeNode SelectedNode 62 { 63 get { return edNode; } 64 private set { edNode = value; } 65 } 66
67 public virtual T SelectedNodeData 68 { 69 get { return (T)edItem; } 70 set 71 { 72 lected = value; 73 ComboBox(value); 74 } 75 } 76
77 protected new int SelectedIndex 78 { 79 get { return edIndex; } 80 set { edIndex = value; } 81 } 82
83 protected new object SelectedItem 84 { 85 get { return edItem; } 86 set { edItem = value; } 87 } 88
89 public virtual string DisplayMember { get; set; } = "Name"; 90
91 ///
94 ///
98 public new int DropDownHeight { get; set; } = 100; 99
100 public new int DropDownWidth { get; set; } = 100;101
102 protected virtual void ShowDropDown()103 {104 = ;105 = wnHeight;106 = ;107 = wnHeight;108 = ;109 ();110 wnOpen = true;111 (this, 0, );112 }113
114 protected virtual void HideDropDown()115 {116 ();117 wnOpen = false;118 }119
120 protected virtual void ToggleDropDown()121 {122 if (!wnOpen)123 {124 opDown();125 }126 else127 {128 opDown();129 }130 }131
132 protected override void WndProc(ref Message m)133 {134 if ((WM_LBUTTONDOWN == ) || (WM_LBUTTONDBLCLK == ))135 {136 if (!d)137 {138 ();139 }140 DropDown();141 }142 else143 {144 c(ref m);145 }146 }147
148 protected override void Dispose(bool disposing)149 {150 if (disposing)151 {152 if (wn != null)153 {154 e();155 wn = null;156 }157 }158 e(disposing);159 }160
161 protected virtual void WhenTreeNodeChanged(TreeNode newValue)162 {163 if ((null != edNode) || (null != newValue))164 {165 bool changed;166 if ((null != edNode) && (null != newValue))167 {168 changed = (hCode() != hCode());169 }170 else171 {172 changed = true;173 }174
175 if (changed)176 {177 if (null != deChanged)178 {179 try180 {181 (this, new TreeNodeChangedEventArgs(edNode, newValue));182 }183 catch (Exception)184 {185 // do nothing186 }187 }188
189 edNode = newValue;190 ComboBox(eNodeData(newValue));191 }192 }193 }194
195 protected virtual void OnDropDownClosed(object sender, ToolStripDropDownClosedEventArgs e)196 {197 if (null == lected)198 {199 var selectedNode = edNode;200 eeNodeChanged(selectedNode);201 }202 }203
204 protected virtual void UpdateComboBox(T data)205 {206 yMember = yMember; // update DisplayMember207 if (null != data)208 {209 urce = new List
218 protected virtual void WhenAfterExpand(object sender, TreeViewEventArgs e)219 {220 if (null != lected)221 {222 if (ChildNode(, lected))223 {224 lected = null;225 }226 }227 }228
229 protected virtual void WhenComboboxSizeChanged(object sender, EventArgs e)230 {231 wnWidth = ;232 }233
234 public virtual bool SelectChildNode(TreeNodeCollection nodes, T data)235 {236 var node = ildNode(nodes, data);237 if (null != node)238 {239 ctTreeNode(node);240 return true;241 }242 else243 {244 return false;245 }246 }247
248 protected abstract bool Identical(T x, T y);249
250 protected virtual void DoSelectTreeNode(TreeNode node)251 {252 edNode = node;253 TreeNode();254 }255
256 public virtual TreeNode FindChildNode(TreeNodeCollection nodes, T data)257 {258 foreach (TreeNode node in nodes)259 {260 var nodeData = eNodeData(node);261 if (cal(nodeData, data))262 {263 return node;264 }265 }266
267 return null;268 }269
270 public virtual void ExpandTreeNode(TreeNode node)271 {272 if (null != node)273 {274 ();275 TreeNode();276 }277 }278
279 public abstract T GetTreeNodeData(TreeNode node);280 }281 }
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687381980a5856.html
评论列表(0条)