/// <summary> /// 给标签节点添加信息节点关联,当用户在树中删除标签节点时,标签节点及其关联的“信息节点关联关系”会删除,但不会删除信息节点本身。 private void AddInfoNodeToLabel() { //var dataObj = labeltree.SelectedItem.NodeData.DataItem as LabelNodeDataInfo; 如此获得的数据对象不是数据库信息选项卡中的标签节点的数据对象 //var accessObj = labeltree.SelectedItem.NodeData.AccessObject as LabelNodeAccess; string labelnodePath = labeltree.SelectedItem.NodeData.DataItem.Path; //查找节点 TreeViewIconsItem nodeNeedToAddInfoNode = curDbInfoTab.LabelViewObj.SuperTree.Nodes.FirstOrDefault(n => n.Path == labelnodePath); var dataObj = nodeNeedToAddInfoNode.NodeData.DataItem as LabelNodeDataInfo; var accessObj = nodeNeedToAddInfoNode.NodeData.AccessObject as LabelNodeAccess; DBInfoNodeInfo infoNodeInfo = new DBInfoNodeInfo() { ModifyTime = DateTime.Now, //Path= curDbInfoTab.CurrentTreeView.SelectedItem.NodeData.DataItem.Path Path = InfoNodeDataInfoObj.Path }; //不加入重复的信息节点 if (dataObj.AttachInfoNodeInfos.IndexOf(infoNodeInfo) == -1) { //创建连接字符串 String EFConnectionString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); InfoNodeRepository repository = new InfoNodeRepository(EFConnectionString); //InfoNodeDataInfo obj = SelectedInfoNodeDataObj.DataItem as InfoNodeDataInfo; InfoNodeDB dbobj = repository.GetInfoNodeDBWithoutFileInfosByPath(InfoNodeDataInfoObj.Path); //给标签节点添加标签节点与信息节点的关联 accessObj.AddInfoNodeAssociation(dataObj.Path, infoNodeInfo, dbobj); dataObj.AttachInfoNodeInfos.Add(infoNodeInfo); } }
/// <summary> /// 从数据库中装入标签树 /// </summary> /// <param name="argu"></param> private void LoadLabelTree() { //创建连接字符串 String EFConnectString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); // this.Cursor = Cursors.AppStarting; Task tsk = new Task(() => { labeltree.EFConnectionString = EFConnectString; String treeXML = labeltree.LoadTreeXMLFromDB(); Action afterFetchTreeXML = () => { labeltree.LoadFromXmlString(treeXML); //MenuItem mnuChangeTextColor = labeltree.ContextMenu.Items[labeltree.ContextMenu.Items.Count - 1] as MenuItem; //Cursor = null; //设置己从数据库中装入标记 //curDbInfoTab.HasBeenLoadedFromDB = true; }; Dispatcher.BeginInvoke(afterFetchTreeXML); }); tsk.Start(); }
public void SaveTreeToDB(SuperTreeView TreeViewNeedToSave) { String treeXml = TreeViewNeedToSave.saveToXmlString(); //if (treeXml == null) // return; (new NodeTreeRepository(DALConfig.getEFConnectionString(dbInfoObject.DatabaseFilePath))).SaveTree(treeXml, TreeViewNeedToSave.TreeNodeType); }
/// <summary> /// 从数据库中为当前激活的选项卡装入信息 /// </summary> /// <param name="argu"></param> public void LoadCurrentTabDataFromDB() { //绑定显示数据源 if (findNodesWindow == null) { findNodesWindow = new FindNodes(); } //创建连接字符串 String EFConnectString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); //this.Title = "我的信息基地-" + curDbInfoTab.dbInfoObject.DatabaseFilePath; this.Title = "我的信息基地"; this.Cursor = Cursors.AppStarting; //profiler发现,GetTreeFromDB()需要花费大量的时间,因此,将其移到独立的线程中去完成 tbInfo.Text = "从数据库中装载数据……"; foreach (SuperTreeView treeView in curDbInfoTab.InnerTreeViewList) { Task tsk = new Task(() => { treeView.EFConnectionString = EFConnectString; String treeXML = treeView.LoadTreeXMLFromDB(); Action afterFetchTreeXML = () => { treeView.LoadFromXmlString(treeXML); treeView.ShowNode(curDbInfoTab.dbInfoObject.LastVisitNodePath); //绑定树节点集合到查找窗体 findNodesWindow.SetTree(curDbInfoTab.OutLineViewObj.SuperTree); curDbInfoTab.visitedNodesManager = new VisitedNodesManager(treeView); MenuItem mnuChangeTextColor = treeView.ContextMenu.Items[treeView.ContextMenu.Items.Count - 1] as MenuItem; ColorBrushList brushList = new ColorBrushList(mnuChangeTextColor); brushList.BrushChanged += brushList_BrushChanged; tbInfo.Text = "就绪。"; Cursor = null; ////设置己从数据库中装入标记 curDbInfoTab.HasBeenLoadedFromDB = true; }; Dispatcher.BeginInvoke(afterFetchTreeXML); }); tsk.Start(); } }
private void CreateAssociation() { //创建连接字符串 String EFConnectionString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); string labelnodePath = labeltree.SelectedItem.NodeData.DataItem.Path; string infoNodePath = InfoNodeDataInfoObj.Path; //创建多对多关联时,对信息节点与标签节点在数据库中均存在的,不能直接修改数据库表或实体类,而应该修改关联关系 using (MyDBEntities context = new MyDBEntities(EFConnectionString)) { var infoNode = context.InfoNodeDBs.FirstOrDefault(p => p.Path == infoNodePath); var labelNode = context.LabelNodeDBs.FirstOrDefault(p => p.Path == labelnodePath); if (infoNode != null && labelNode != null) { infoNode.LabelNodeDBs.Add(labelNode); labelNode.InfoNodeDBs.Add(infoNode); //context.LabelNodeDBs.Add(labelNode);//不能再添加了否则数据库中会多出一个ID不同的labelNode // context.InfoNodeDBs.Add(infoNode);//不能再添加了否则数据库中会多出一个ID不同的infoNode int r = context.SaveChanges(); //给标签添加信息绑定 DBInfoNodeInfo infoNodeInfo = new DBInfoNodeInfo() { ID = infoNode.ID, ModifyTime = DateTime.Now, Path = InfoNodeDataInfoObj.Path }; //查找节点 TreeViewIconsItem nodeNeedToAddInfoNode = curDbInfoTab.LabelViewObj.SuperTree.Nodes.FirstOrDefault(n => n.Path == labelnodePath); var dataObj = nodeNeedToAddInfoNode.NodeData.DataItem as LabelNodeDataInfo; //不加入重复的信息节点 if (dataObj.AttachInfoNodeInfos.IndexOf(infoNodeInfo) == -1) { dataObj.AttachInfoNodeInfos.Add(infoNodeInfo); } //给信息添加标签绑定 DBLabelInfo labelInfo = new DBLabelInfo() { ID = labelNode.ID, ModifyTime = DateTime.Now, Path = labelnodePath, // Label = selectedlabel }; if (InfoNodeDataInfoObj.AttachLabels.IndexOf(labelInfo) == -1) { InfoNodeDataInfoObj.AttachLabels.Add(labelInfo); } } } }
private void DeleteNode(object sender, ExecutedRoutedEventArgs e) { if (curDbInfoTab.CurrentTreeView.IsInEditMode) { curDbInfoTab.CurrentTreeView.SelectedItem.EndEdit(); } //删除多级节点时询问用户 TreeViewIconsItem selectedNode = curDbInfoTab.CurrentTreeView.SelectedItem as TreeViewIconsItem; if (selectedNode != null && curDbInfoTab.CurrentTreeView.GetChildren(selectedNode).Count > 0) { MessageBoxResult result = MessageBox.Show("您将要删除一个包含有下级信息的节点,删除操作不可恢复,真的进行吗?", "删除节点", MessageBoxButton.OKCancel); if (result == MessageBoxResult.Cancel) { return; } } curDbInfoTab.CurrentTreeView.DeleteNode(selectedNode); //保存树结构 curDbInfoTab.SaveTreeToDB(); //此时可能出现一个WPF中的bug,当删除树窗口中最后一个节点时,会导致树窗口内部卡死,添加的节点实际存在但无法显示在树窗口中,于是在此处重新添加视图,以避开此bug if (curDbInfoTab.CurrentTreeView.Nodes.Count == 0) { //findNodesWindow.ShouldExit = true; //Close(); //Process.Start(Assembly.GetEntryAssembly().Location); if (curDbInfoTab.CurrentTreeView.TreeNodeType == "InfoNode") { curDbInfoTab.OutLineViewObj = new OutLineView(curDbInfoTab); curDbInfoTab.OutLineViewObj.SuperTree.EFConnectionString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); curDbInfoTab.InnerTabControl.SelectedIndex = 1; curDbInfoTab.InnerTabControl.SelectedIndex = 0; } if (curDbInfoTab.CurrentTreeView.TreeNodeType == "LabelNode") { curDbInfoTab.LabelViewObj = new LabelView(curDbInfoTab); curDbInfoTab.LabelViewObj.SuperTree.EFConnectionString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); curDbInfoTab.InnerTabControl.SelectedIndex = 0; curDbInfoTab.InnerTabControl.SelectedIndex = 1; } } }
private void DBtabContainer_SelectionChanged(object sender, SelectionChangedEventArgs e) { //初始化时,此方法不做任何事,仅设置默认标题 if (DBtabContainer.SelectedIndex == -1) { this.Title = MainWindowDefaultTitle; return; } //当TabControl的TabItem中放置有ComboBox控件时,ComboBox的SelectionChanged事件会触发 //TabControl的SelectionChanged事件,虽然可以通过在下层控件的事件响应过程中添加 //e.Handled = true阻止这一过程,但还是在此屏蔽掉此事件的响应代码,以免有漏网之鱼 if (e.AddedItems.Count == 1 && e.AddedItems[0].GetType().Name != "TabItem") { return; } curDbInfoTab = (DBtabContainer.Items[DBtabContainer.SelectedIndex] as TabItem).Content as DBInfoTab; this.Title = "个人资料管理中心-" + curDbInfoTab.dbInfoObject.DatabaseFilePath; if (curDbInfoTab.HasBeenLoadedFromDB == false) { //从数据库中装入数据 LoadCurrentTabDataFromDB(); } else { String EFConnectString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); curDbInfoTab.treeView1.EFConnectionString = EFConnectString; findNodesWindow.SetTree(curDbInfoTab.treeView1); curDbInfoTab.RefreshDisplay(); } //切换选项卡时,恢复状态栏默认显示文本 if (cutNode == null) { ShowInfo("就绪"); } }
private void AddNode(AddNodeCategory category) { string treeNodeType = labeltree.TreeNodeType; //为新节点生成默认文本 String NodeText = MainWin.getDefaultNodeText(treeNodeType) + (labeltree.NodeCount + 1); //尝试从剪贴板中提取文本 String textFromClipboard = StringUtils.getFirstLineOfString(Clipboard.GetText()); if (String.IsNullOrEmpty(textFromClipboard) == false && textFromClipboard != LastPasteNodeText && textFromClipboard.IndexOf("/") == -1) { //检测一下从剪贴板中获取的文本是否有效(即不会导致重名的节点出现) String newNodeText = textFromClipboard; bool nodeExisted = labeltree.IsNodeExisted(MainWin.getNewNodePath(category, newNodeText)); //如果不存在同名的路径 if (nodeExisted == false) { NodeText = newNodeText; LastPasteNodeText = NodeText; } } //如果还有重复路径的,则循环使用随机数,务必保证路径不会相同 while (labeltree.IsNodeExisted(MainWin.getNewNodePath(category, NodeText))) { NodeText = MainWin.getDefaultNodeText(treeNodeType) + new Random().Next() as string; } //创建默认的节点数据对象 NodeDataObject dataobject = NodeFactory.CreateDataInfoNode(treeNodeType, DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath)); TreeViewIconsItem newNode = null; //在树中添加节点 switch (category) { case AddNodeCategory.AddRoot: newNode = labeltree.AddRoot(NodeText, dataobject); curDbInfoTab.LabelViewObj.SuperTree.AddRoot(NodeText, dataobject); break; case AddNodeCategory.AddChild: newNode = labeltree.AddChild(NodeText, dataobject); curDbInfoTab.LabelViewObj.SuperTree.AddChild(NodeText, dataobject); break; case AddNodeCategory.AddSibling: newNode = labeltree.AddSibling(NodeText, dataobject); curDbInfoTab.LabelViewObj.SuperTree.AddSibling(NodeText, dataobject); break; default: break; } if (newNode == null) { return; } //新节点,默认不是粗体的 newNode.FontWeight = FontWeights.Normal; //在数据库中创建记录 if (dataobject.AccessObject != null) { dataobject.AccessObject.Create(dataobject.DataItem); } //保存树结构 curDbInfoTab.SaveTreeToDB(labeltree); //自动进入编辑状态 newNode.BeginEdit(); }
public void ChangeNodeType(String ToType) { if (treeView1.SelectedItem == null) { return; } treeView1.SelectedItem.EndEdit(); String FromType = treeView1.SelectedItem.NodeData.DataItem.NodeType; NodeDataObject nodeDataObject = treeView1.SelectedItem.NodeData; if (nodeDataObject.DataItem.NodeType == ToType) { MessageBox.Show(String.Format("本节点己经是{0}型的了。", ToType)); return; } if (NodeTypeChanger.CanChangeTo(FromType, ToType) == false) { MessageBox.Show(string.Format("不能完成从{0}到{1}类型的转换。", FromType, ToType)); return; } NodeDataObject detailTextNodeDataObject = NodeTypeChanger.GetNodeChanger(FromType, ToType).ChangeTo(nodeDataObject, DALConfig.getEFConnectionString(dbInfoObject.DatabaseFilePath)); if (detailTextNodeDataObject != null) { treeView1.SelectedItem.NodeData = detailTextNodeDataObject; ChangeNodeIcon(treeView1.SelectedItem, detailTextNodeDataObject.DataItem.SelectedIcon); LoadDataAndShowInUI(treeView1.SelectedItem); SaveTreeToDB(); } }
/// <summary> /// 将树结构保存到数据库中 /// </summary> public void SaveTreeToDB() { String treeXml = treeView1.saveToXmlString(); (new MainTreeRepository(DALConfig.getEFConnectionString(dbInfoObject.DatabaseFilePath))).SaveTree(treeXml); }
/// <summary> /// 将树结构保存到数据库中 /// </summary> public void SaveTreeToDB() { String treeXml = CurrentTreeView.saveToXmlString(); (new NodeTreeRepository(DALConfig.getEFConnectionString(dbInfoObject.DatabaseFilePath))).SaveTree(treeXml, CurrentTreeView.TreeNodeType); }
private void PasteNode(object sender, ExecutedRoutedEventArgs e) { if (curDbInfoTab.CurrentTreeView.IsInEditMode) { curDbInfoTab.CurrentTreeView.SelectedItem.EndEdit(); } if (cutNode == null || cutNodeSourceTab == null) { return; } TreeViewIconsItem selectedNode = curDbInfoTab.CurrentTreeView.SelectedItem as TreeViewIconsItem; if (selectedNode == cutNode) { return; } String newPath = ""; if (selectedNode == null)//如果目标选项卡中没有选中任何节点,则默认添加到根节点 { newPath = "/" + cutNode.HeaderText + "/"; } else { newPath = selectedNode.Path + cutNode.HeaderText + "/"; } if (curDbInfoTab.CurrentTreeView.IsNodeExisted(newPath)) { MessageBox.ShowInformation("在此处粘贴将导致两个节点拥有相同的路径,因此,请在其他地方粘贴"); return; } //在同一数据库中粘贴 if (curDbInfoTab == cutNodeSourceTab) { //先移除被剪切的子树 curDbInfoTab.CurrentTreeView.CutNode(cutNode); curDbInfoTab.CurrentTreeView.PasteNode(cutNode, selectedNode); curDbInfoTab.OnNodeMove(NodeMoveType.NodePaste); } else { //在不同的数据库中粘贴 String sourcePath = cutNode.Path; String targetPath = ""; if (selectedNode != null) { targetPath = selectedNode.Path; } else { targetPath = "/"; } //先移除源树中被剪切的子树 cutNodeSourceTab.CurrentTreeView.CutNode(cutNode); //将剪切的节点子树追加到当前节点 curDbInfoTab.CurrentTreeView.PasteNodeCrossDB(cutNode, selectedNode); //保存目标树结构 curDbInfoTab.CurrentTreeView.SaveToDB(); //将源树保存到数据库中 cutNodeSourceTab.CurrentTreeView.SaveToDB(); //更新所有粘贴节点的数据存取对象 String EFConnectionString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); if (selectedNode != null) { UpdateDataAcessObject(selectedNode, EFConnectionString); } else { UpdateDataAcessObject(cutNode, EFConnectionString); } //更新数据库中内容 NodeMoveBetweenDBManager nodeMoveManager = new NodeMoveBetweenDBManager(cutNodeSourceTab.dbInfoObject.DatabaseFilePath, curDbInfoTab.dbInfoObject.DatabaseFilePath); nodeMoveManager.MoveNodeBetweenDB(sourcePath, targetPath); } //取消删除线显示 cutNode.Strikethrough = false; cutNode = null; cutNodeSourceTab = null; if (curDbInfoTab.CurrentTreeView.SelectedItem != null) { curDbInfoTab.CurrentTreeView.SelectedItem.IsExpanded = true; } }
private void DBtabContainer_SelectionChanged(object sender, SelectionChangedEventArgs e) { //打开数据库,首次选择节点时,附加栏选项卡的SelectionChanged事件被触发,此处用于屏蔽此路由事件,也可在事件源屏蔽。 if (e.Source.GetType().Name == "DBInfoTab") { return; } //初始化时,此方法不做任何事,仅设置默认标题,下面语句无法执行 if (DBtabContainer.SelectedIndex == -1) { this.Title = MainWindowDefaultTitle; return; } if (e.AddedItems.Count == 1 && e.AddedItems[0].GetType().Name != "TabItem") { return; } //初始化时,此方法不做任何事,仅设置默认标题 if (e.OriginalSource.GetType().Name == "InfoTabControl") { //if (e.RemovedItems.Count <= 0) //{ curDbInfoTab = (DBtabContainer.Items[DBtabContainer.SelectedIndex] as TabItem).Content as DBInfoTab; curDbInfoTab.EditorTool = EditorTool; curDbInfoTab.InnerTabControl.SelectedIndex = curDbInfoTab.dbInfoObject.LastTabViewIndex; this.Title = MainWindowDefaultTitle; if (curDbInfoTab.HasBeenLoadedFromDB == false) { //从数据库中装入数据 LoadCurrentTabDataFromDB(); curDbInfoTab.HasBeenLoadedFromDB = true; } //return; //} } //TabControl的SelectionChanged事件,虽然可以通过在下层控件的事件响应过程中添加 //e.Handled = true阻止这一过程,但还是在此屏蔽掉此事件的响应代码,以免有漏网之鱼 if (e.AddedItems.Count == 1 && e.AddedItems[0].GetType().Name != "TabItem") { return; } // this.Title = "我的信息基地-" + curDbInfoTab.dbInfoObject.DatabaseFilePath; this.Title = "我的信息基地"; if (curDbInfoTab.HasBeenLoadedFromDB == false) { //从数据库中装入数据 LoadCurrentTabDataFromDB(); curDbInfoTab.HasBeenLoadedFromDB = true; } else { String EFConnectString = DALConfig.getEFConnectionString(curDbInfoTab.dbInfoObject.DatabaseFilePath); curDbInfoTab.CurrentTreeView.EFConnectionString = EFConnectString; findNodesWindow.SetTree(curDbInfoTab.OutLineViewObj.SuperTree); curDbInfoTab.RefreshDisplay(); } //切换选项卡时,恢复状态栏默认显示文本 if (cutNode == null) { ShowInfo("就绪"); } }