轉(zhuǎn)帖|其它|編輯:郝浩|2010-12-13 16:08:15.000|閱讀 3458 次
概述:應(yīng)用軟件是否好用就體現(xiàn)在一些細(xì)節(jié)操作上,開(kāi)發(fā)人員是否考慮到了很多細(xì)節(jié),例如一個(gè)樹(shù)形結(jié)構(gòu)的數(shù)據(jù)若不支持拖拽功能那用起來(lái)會(huì)很糟糕一些,用戶體驗(yàn)也會(huì)不太爽,下面就以通用權(quán)限管理系統(tǒng)組件源碼中的組織機(jī)構(gòu)(部門)管理模塊為例子,講解一下樹(shù)型結(jié)構(gòu)TreeView節(jié)點(diǎn)拖拽的簡(jiǎn)單功能實(shí)現(xiàn)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
應(yīng)用軟件是否好用就體現(xiàn)在一些細(xì)節(jié)操作上,開(kāi)發(fā)人員是否考慮到了很多細(xì)節(jié),例如一個(gè)樹(shù)形結(jié)構(gòu)的數(shù)據(jù)若不支持拖拽功能那用起來(lái)會(huì)很糟糕一些,用戶體驗(yàn)也會(huì)不太爽,下面就以通用權(quán)限管理系統(tǒng)組件源碼中的組織機(jī)構(gòu)(部門)管理模塊為例子,講解一下樹(shù)型結(jié)構(gòu)TreeView節(jié)點(diǎn)拖拽的簡(jiǎn)單功能實(shí)現(xiàn)。
其實(shí)組織機(jī)構(gòu)管理模塊平時(shí)不怎么用到拖拽功能,但是往往在數(shù)據(jù)初始化時(shí)為了實(shí)現(xiàn)快速輸入數(shù)據(jù)及進(jìn)行整理調(diào)整數(shù)據(jù)時(shí),往往就非常迫切需要一個(gè)靈活的組織機(jī)構(gòu)管理器,當(dāng)每到年底或者公司進(jìn)行大的人事調(diào)整時(shí)也會(huì)遇到后臺(tái)管理員迫切需要拖拽功能的需求,平時(shí)組織機(jī)構(gòu)不會(huì)有大變動(dòng)。
軟件功能是否好用,往往是體現(xiàn)在最需要折騰數(shù)據(jù)時(shí)是否好用?養(yǎng)兵千日用兵一時(shí),一般沒(méi)經(jīng)過(guò)磨難的新開(kāi)發(fā)的軟件往往會(huì)想得不夠周到,關(guān)鍵時(shí)刻容易掉鏈子,經(jīng)不起客戶的折騰。
例子程序運(yùn)行效果如何下:
當(dāng)然在節(jié)點(diǎn)拖拽時(shí),需要注意幾個(gè)事情:
1:拖拽時(shí)總需要有提示信息比較好,防止誤操作后找不到被托摘到哪里去了。
2:父親節(jié)點(diǎn)總不能拖拽到自己的子節(jié)點(diǎn)上,那不是死循環(huán)或者亂了輩份了不是?
為了讓TreeView支持拖拽功能,需要注意以下幾個(gè)屬性設(shè)置及相應(yīng)的事件代碼。
代碼實(shí)現(xiàn)參考如下:
private void tvOrganize_ItemDrag(object sender, ItemDragEventArgs e)
{
if (this.permissionEdit)
{
// 開(kāi)始進(jìn)行拖放操作,并將拖放的效果設(shè)置成移動(dòng)。
this.DoDragDrop(e.Item, DragDropEffects.Move);
}
}
private void tvOrganize_DragEnter(object sender, DragEventArgs e)
{
// 拖動(dòng)效果設(shè)成移動(dòng)
e.Effect = DragDropEffects.Move;
}
private void tvOrganize_DragDrop(object sender, DragEventArgs e)
{
// 定義一個(gè)中間變量
TreeNode treeNode;
//判斷拖動(dòng)的是否為TreeNode類型,不是的話不予處理
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
{
// 拖放的目標(biāo)節(jié)點(diǎn)
TreeNode targetTreeNode;
// 獲取當(dāng)前光標(biāo)所處的坐標(biāo)
// 定義一個(gè)位置點(diǎn)的變量,保存當(dāng)前光標(biāo)所處的坐標(biāo)點(diǎn)
Point point = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
// 根據(jù)坐標(biāo)點(diǎn)取得處于坐標(biāo)點(diǎn)位置的節(jié)點(diǎn)
targetTreeNode = ((TreeView)sender).GetNodeAt(point);
// 獲取被拖動(dòng)的節(jié)點(diǎn)
treeNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
// 判斷拖動(dòng)的節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)是否是同一個(gè),同一個(gè)不予處理
if (BaseInterfaceLogic.TreeNodeCanMoveTo(treeNode, targetTreeNode))
{
if (BaseSystemInfo.ShowInformation)
{
// 是否移動(dòng)部門
if (MessageBox.Show(AppMessage.Format(AppMessage.MSG0038, treeNode.Text, targetTreeNode.Text), AppMessage.MSG0000, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
}
ServiceManager.Instance.OrganizeService.MoveTo(UserInfo, treeNode.Tag.ToString(), targetTreeNode.Tag.ToString());
// 往目標(biāo)節(jié)點(diǎn)中加入被拖動(dòng)節(jié)點(diǎn)的一份克隆
targetTreeNode.Nodes.Add((TreeNode)treeNode.Clone());
// 將被拖動(dòng)的節(jié)點(diǎn)移除
treeNode.Remove();
}
}
}
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載