昨天发现简单的改进的下拉树形框控件,和大家一起分享
控件代码:
1using System.Data;
2using System.Web.UI;
3using System.Web;
4using System.Web.UI.WebControls;
5using System.ComponentModel;
6
7using Discuz.Common;
8using Discuz.Data;
9
10namespace Discuz.Control
11{
12 /**//// <summary>
13 /// 下拉树形框控件。
14 /// </summary>
15 [DefaultProperty("Text"),ToolboxData("<{0}:DropDownTreeList runat=server></{0}:DropDownTreeList>")]
16 public class DropDownTreeList : Discuz.Control.WebControl, IPostBackDataHandler, IPostBackEventHandler
17 {
18 /**//// <summary>
19 /// 下拉列表框控件变量
20 /// </summary>
21 public System.Web.UI.WebControls.DropDownList TypeID=new System.Web.UI.WebControls.DropDownList();
22
23
24 /**//// <summary>
25 /// 构造函数
26 /// </summary>
27 public DropDownTreeList(): base()
28 {
29 this.BorderStyle = BorderStyle.Groove;
30 this.BorderWidth=1;
31 }
32
33 /**//// <summary>
34 /// 构造函数
35 /// </summary>
36 /// <param name="sqlstring">查询字符串</param>
37 public DropDownTreeList(string sqlstring): this()
38 {
39 BuildTree(sqlstring);
40 }
41
42 /**//// <summary>
43 /// 构造函数
44 /// </summary>
45 /// <param name="sqlstring">查询字符串</param>
46 /// <param name="selectid">选取项</param>
47 public DropDownTreeList(string sqlstring,string selectid): this(sqlstring)
48 {
49 this.TypeID.SelectedValue=selectid;
50 }
51
52 /**//// <summary>
53 /// 创建树
54 /// </summary>
55 public void BuildTree()
56 {
57 if((this.SqlText!=null)&&(this.SqlText!=""))
58 {
59 BuildTree(this.SqlText);
60 }
61 }
62
63 /**//// <summary>
64 /// 创建树
65 /// </summary>
66 /// <param name="sqlstring">查询字符串</param>
67 public void BuildTree(string sqlstring)
68 {
69
70 string SelectedType="0";
71
72 TypeID.SelectedValue=SelectedType;
73
74 this.Controls.Add(TypeID);
75
76 DataTable dt = DbHelper.ExecuteDataset(CommandType.Text, sqlstring).Tables[0];
77
78 TypeID.Items.Clear();
79 //加载树
80 TypeID.Items.Add(new ListItem("请选择 ","0"));
81 DataRow [] drs = dt.Select(this.ParentID+"=0");
82
83 foreach( DataRow r in drs )
84 {
85 TypeID.Items.Add(new ListItem(r[1].ToString(),r[0].ToString()));
86 string blank = HttpUtility.HtmlDecode(" ");
87 BindNode( r[0].ToString() , dt,blank);
88 }
89 TypeID.DataBind();
90
91 }
92
93 /**//// <summary>
94 /// 创建树
95 /// </summary>
96 /// <param name="sqlstring">查询字符串</param>
97 /// <param name="selectid">选取项</param>
98 public void BuildTree(string sqlstring,string selectid)
99 {
100 BuildTree(sqlstring);
101 this.TypeID.SelectedValue=selectid;
102 }
103
104 /**//// <summary>
105 /// 创建树结点
106 /// </summary>
107 /// <param name="sonparentid">当前数据项</param>
108 /// <param name="dt">数据表</param>
109 /// <param name="blank">空白符</param>
110 private void BindNode(string sonparentid ,DataTable dt,string blank)
111 {
112 DataRow [] drs = dt.Select(this.ParentID+"=" + sonparentid );
113
114 foreach( DataRow r in drs )
115 {
116 string nodevalue = r[0].ToString();
117 string text = r[1].ToString();
118 text = blank + text;
119 TypeID.Items.Add(new ListItem(text,nodevalue));
120 string blankNode = HttpUtility.HtmlDecode(" " + blank);
121 BindNode(nodevalue,dt,blankNode);
122 }
123 }
124
125
126 /**//// <summary>
127 /// 选取项
128 /// </summary>
129 [Bindable(true),Browsable(true),Category("Appearance"),DefaultValue("")]
130 public string SelectedValue
131 {
132 get
133 {
134 return this.TypeID.SelectedValue;
135 }
136
137 set
138 {
139 this.TypeID.SelectedValue = value;
140 }
141 }
142
143 /**//// <summary>
144 /// 父字段名称
145 /// </summary>
146 private string m_parentid="parentid";
147 [Bindable(true),Category("Appearance"),DefaultValue("parentid")]
148 public string ParentID
149 {
150 get
151 {
152 return m_parentid;
153 }
154
155 set
156 {
157 m_parentid = value;
158 }
159 }
160
161
162 SQL字符串#region SQL字符串
163
164 /**//// <summary>
165 /// SQL字符串变量
166 /// </summary>
167 private string sqltext;
168
169
170 /**//// <summary>
171 /// SQL字符串属性
172 /// </summary>
173 [Bindable(true), Category("Appearance"), DefaultValue("")]
174 public string SqlText
175 {
176 get
177 {
178 return sqltext;
179 }
180
181 set
182 {
183 sqltext = value;
184 }
185 }
186
187 #endregion
188
189
190 /**//// <summary>
191 /// 当某选项被选中后,获取焦点的控件ID(如提交按钮等)
192 /// </summary>
193 [Bindable(true),Category("Appearance"),DefaultValue("")]
194 public string SetFocusButtonID
195 {
196 get
197 {
198 object o = ViewState[this.ClientID+"_SetFocusButtonID"];
199 return (o==null)?"":o.ToString();
200 }
201 set
202 {
203 ViewState[this.ClientID+"_SetFocusButtonID"] = value;
204 if(value!="")
205 {
206 this.TypeID.Attributes.Add("onChange","document.getElementById('"+value+"').focus();");
207 }
208 }
209 }
210
211 /**//// <summary>
212 /// 输出html,在浏览器中显示控件
213 /// </summary>
214 /// <param name="output"> 要写出到的 HTML 编写器 </param>
215 protected override void Render(HtmlTextWriter output)
216 {
217 if (this.HintInfo != "")
218 {
219 output.WriteBeginTag("span id=\"" + this.ClientID + "\" οnmοuseοver=\"showhintinfo(this," + this.HintLeftOffSet + "," + this.HintTopOffSet + ",'" + this.HintTitle + "','" + this.HintInfo + "','" + this.HintHeight + "','" + this.HintShowType + "');\" οnmοuseοut=\"hidehintinfo();\">");
220 }
221
222 RenderChildren(output);
223
224 if (this.HintInfo != "")
225 {
226 output.WriteEndTag("span");
227 }
228 }
229
230
231
232 IPostBackDataHandler 成员#region IPostBackDataHandler 成员
233
234
235 /**//// <summary>
236 /// 引发PostBackChanged事件
237 /// </summary>
238 public void RaisePostDataChangedEvent()
239 {
240 }
241
242
243 /**//// <summary>
244 /// 引发PostBack事件
245 /// </summary>
246 /// <param name="eventArgument"></param>
247 public void RaisePostBackEvent(string eventArgument)
248 {
249 }
250
251 /**//// <summary>
252 /// 加载提交数据
253 /// </summary>
254 /// <param name="postDataKey"></param>
255 /// <param name="postCollection"></param>
256 /// <returns></returns>
257 public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
258 {
259
260 string presentValue = this.TypeID.SelectedValue;
261 string postedValue = postCollection[postDataKey];
262
263 //如果回发数据不等于原有数据
264 if (!presentValue.Equals(postedValue))
265 {
266 this.SqlText = postedValue;
267 return true;
268 }
269 return false;
270
271 }
272 #endregion
273
274 }
275}
276
使用方法:
页面aspx代码:
<%@ Register TagPrefix="cc2" Namespace="Discuz.Control" Assembly="Discuz.Control" %>
<div id="showtargetforum" runat="server">
<cc2:DropDownTreeList id="targetforumid" runat="server" Visible="true"></cc2:DropDownTreeList>
</div>
*.apsx.cs代码:
public void InitInfo()
{
#region 初始化信息绑定
targetforumid.BuildTree(DatabaseProvider.GetInstance().GetForumsTree());
//绑定SQL语句
if (DNTRequest.GetString("fid") != "")
{
targetforumid.SelectedValue = DNTRequest.GetString("fid");
//addtype.SelectedValue = "1";
targetforumid.Visible = true;
}
#endregion
}