轉(zhuǎn)帖|其它|編輯:郝浩|2011-03-22 13:47:11.000|閱讀 1944 次
概述:本文是從WinForm場(chǎng)景中實(shí)現(xiàn)了在網(wǎng)站開發(fā)中經(jīng)常使用的checkbox選中功能
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
背景
今天,在做一個(gè)指紋管理平臺(tái)的界面上,遇到了一些問題,因?yàn)楣镜幕A(chǔ)庫(kù)中沒有針對(duì)Winform平臺(tái)的操作,所以在一個(gè)部門選擇的場(chǎng)景中,關(guān)于如何獲取部門TreeView中被選中的項(xiàng)目被難住了。所幸還有一個(gè)神器叫做搜索引擎,故谷歌一番,發(fā)現(xiàn)Asp.net下的這個(gè)問題很好解決,但是關(guān)于Winform平臺(tái)下的類似問題,如鳳毛麟角啊!
當(dāng)然,今天我也是查了很久,終于發(fā)現(xiàn)了兩篇不錯(cuò)的文章,幫助我解決了這個(gè)問題,不敢獨(dú)享,結(jié)合自己對(duì)使用其方法的心得,特意記錄下來,并通過一個(gè)小例子和大家一起分享。
問題是這樣的
有一個(gè)部門列表,多級(jí)的(或者說無限極),我們?cè)赪inform端列出來(這個(gè)很簡(jiǎn)單)后,需要對(duì)其進(jìn)行部分的選擇,然后通過一個(gè)按鈕,提交選擇好的部門,進(jìn)入下一個(gè)業(yè)務(wù)操作場(chǎng)景,今天我遇到的問題就是,如何獲取這個(gè)部門TreeView中,各個(gè)級(jí)別所選取的項(xiàng)目呢?如下圖:
在這里只是用一個(gè)例子來說明,所以就簡(jiǎn)單一點(diǎn)吧,如左圖所示,我們的任務(wù)就是通過程序獲取被選中的部門,將其信息送到下一個(gè)業(yè)務(wù)場(chǎng)景之中,在傳統(tǒng)的Asp.net中,Web.UI下的Treeview控件提供了很方便的接口方法,用于獲取被選中的項(xiàng)目,但是來到了Winform下,發(fā)現(xiàn)不能用Asp.net的思路來做這個(gè)事情后,我立馬谷歌了一下。
我總結(jié)了一下,原作者的大概思路應(yīng)該如下:
圖1-簡(jiǎn)單的流程圖示意
解決問題:
在頁(yè)面(窗體)申明兩個(gè)變量:
用代碼來描述就是如下形式:
string tag = "True";//Tag標(biāo)簽
StringBuilder nodesTag;//容器
接下來,我們就開始去處理AfterCheck事件,讓程序能夠“記住”我們選擇過的項(xiàng)目。
在了解完算法后,相信大家能離家如下一段的代碼了吧:
遍歷方法:
AfterCheck事件代碼:
這個(gè)方法的調(diào)用時(shí)機(jī)應(yīng)該是什么時(shí)候呢?對(duì)于我的場(chǎng)景來說,應(yīng)該是再點(diǎn)擊那個(gè)業(yè)務(wù)按鈕之后,在之前,我們的AfterCheck事件代碼唯一要做的事情就是如下圖所示的一個(gè)流程:
當(dāng)我們點(diǎn)擊業(yè)務(wù)按鈕之后,為其添加如下代碼即可:
調(diào)用方法 :
再好一點(diǎn):
到這里呢,按理說問題已經(jīng)被解決完了。我們獲取到了選中的部門,但是,按照常規(guī)來說,應(yīng)該“選中節(jié)點(diǎn)的時(shí)候,如果節(jié)點(diǎn)存在子節(jié)點(diǎn),可以選中全部的子節(jié)點(diǎn);如果取消一個(gè)節(jié)點(diǎn)的選中狀態(tài),當(dāng)前節(jié)點(diǎn)同時(shí)又存在父節(jié)點(diǎn)的話,就取消父節(jié)點(diǎn)的選中狀態(tài)”,怎么辦呢?
我覺得自己很懶,“搜”的一下,給大家鏈上一篇文章,我覺得寫的很不錯(cuò)啊,根據(jù)原文的意思,我們結(jié)合之前的獲取選中狀態(tài)的代碼,修改如下:
新的AfterCheck:
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
TreeNode node = e.Node;
if (node.Tag == null)
node.Tag = tag;//附加結(jié)點(diǎn)信息
else
node.Tag = null;
CheckAllChildNodes(e.Node, e.Node.Checked);
//選中父節(jié)點(diǎn)
bool bol = true;
if (e.Node.Parent != null)
{
for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)
{
if (!e.Node.Parent.Nodes[i].Checked)
bol = false;
}
e.Node.Parent.Checked = bol;
////記得如果父節(jié)點(diǎn)被選中或取消,記得設(shè)置它的tag哦
if (bol)
{
e.Node.Parent.Tag = tag;
}
else
{
e.Node.Parent.Tag = null;
}
}
}
}
新的CheckAllChildNodes方法:
根據(jù)博友Flynn2009的提示,應(yīng)該注意代碼需要有修改,如下:
node.Tag = nodeChecked ? (bool)tag : null;
新的CheckAllChildNodes :
結(jié)束:
好啦,在這里呢,我們就完成了獲取Treeview中CheckBox選中狀態(tài)的小例子,并且呢,還人性化的設(shè)置了一個(gè)關(guān)于父子選項(xiàng)的效果。文章就到這里為止吧,希望能給大家?guī)硎斋@。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園