/// <summary> /// Обновляет подчиненные ветви нода /// </summary> /// <param name="nd">нод, чьи подчиненные ветви нужно обновить</param> public void RefreshSubNodes(DTreeNode nd) { TreeNodeCollection nds = (nd == null) ? Nodes : nd.Nodes; nds.Clear(); LoadSubNodes(nd); }
public void ContextMenu_Popup(object sender, EventArgs e) { Point p = PointToClient(MousePosition); var node = (DTreeNode)GetNodeAt(p.X, p.Y); if (node != null) { SelectedNode = node; newItem.Enabled = allowAdd; renameItem.Enabled = allowEdit; deleteItem.Enabled = (node.Nodes.Count == 0) && allowDelete; deleteAllItem.Enabled = !deleteItem.Enabled && allowDelete; sortItem.Enabled = allowMove; findItem.Enabled = allowFind; } else { SelectedNode = null; newItem.Enabled = false; renameItem.Enabled = false; deleteItem.Enabled = false; deleteAllItem.Enabled = false; sortItem.Enabled = false; findItem.Enabled = false; } }
public virtual void RefreshNode(DTreeNode nd) { if (nd == null) { return; } using (var dt = new DataTable()) { string sql; if (!string.IsNullOrEmpty(querySelect)) { sql = querySelect + " " + queryJoin; if (!string.IsNullOrEmpty(queryWhere)) { sql += " " + queryWhere + " AND " + idField + "=" + nd.ID; } sql += " " + queryOrderBy; } else { sql = "SELECT * FROM " + tableName + " WHERE " + idField + "=" + nd.ID; } using (var da = new SqlDataAdapter(sql, ConnectionString)) { da.Fill(dt); } if (dt.Rows.Count == 1) { RefreshNode(dt.Rows[0], nd); } } }
/// <summary> /// Обновляет нод, данными из таблицы /// </summary> /// <param name="row">запись таблицы</param> /// <param name="nd">нод, который нужно обновить</param> public virtual void RefreshNode(DataRow row, DTreeNode nd) { if (textField == "EmpSelect") { textField = (row["КраткоеНазваниеРус"].ToString() != "") ? "КраткоеНазваниеРус" : "Кличка"; } if (textField != null) { nd.Text = (string)row[textField]; } nd.ID = (int)row[idField]; nd.Tag = row; OnFillNode(new FillNodeEventArgs(nd, row)); if (fullLoad) { return; } if (nd.IsExpanded) { return; } if (nd.Nodes.Count == 0 && (int)row[rightField] - (int)row[leftField] > 1) { //подставляем заглушку var n = new DTreeNode(); n.Text = "."; n.ID = 0; n.BackColor = Color.Gainsboro; nd.Nodes.Add(n); } }
/// <summary> /// Выбирает ветку по Id. <br/><see cref="FindNode"/> /// </summary> /// <param name="id"></param> public void SelectNode(int id) { DTreeNode nd = FindNode(id); if (nd == null) { return; } SelectedNode = nd; }
/// <summary> /// Ищет ветку, по Id, при необходимости подгружая данные из базы /// </summary> /// <param name="id">код ветки</param> /// <returns></returns> public DTreeNode FindNode(int id) { DTreeNode nd; using (var dt = new DataTable()) { string sql = " DECLARE @L int, @R int\n" + " SELECT @L=" + leftField + ",@R=" + rightField + " FROM " + tableName + " WHERE " + idField + "=" + id + "\n" + " SELECT " + idField + " FROM " + tableName + " WHERE " + leftField + "<= ISNULL(@L,-1) AND " + rightField + ">= ISNULL(@R,-1) " + " ORDER BY " + leftField; using (var da = new SqlDataAdapter(sql, ConnectionString)) { try { da.Fill(dt); } catch (SqlException sqlEx) { MessageBox.Show(sqlEx.Message, "Ошибка!"); } } if (dt.Rows.Count == 0) { return(null); } TreeNodeCollection nds = Nodes; nd = null; DTreeNode pnd = null; for (int i = 0; i < dt.Rows.Count; i++) { nd = FindNodeIn(nds, (int)dt.Rows[i][idField]); if (nd == null) { RefreshSubNodes(pnd); nd = FindNodeIn(nds, (int)dt.Rows[i][idField]); if (nd == null) { return(null); } } nds = nd.Nodes; pnd = nd; } } return(nd); }
public void AddNode() { // Добавляем новый нод(служебный) // переходим на него if ((SelectedNode != null) && (!SelectedNode.IsExpanded)) { SelectedNode.Expand(); } TreeNodeCollection nds = (SelectedNode != null) ? SelectedNode.Nodes : Nodes; var nd = (DTreeNode)Activator.CreateInstance(nodeType); nd.ID = 0; nd.IsNew = true; nds.Add(nd); SelectedNode = nd; }
private DTreeNode Populate(DataRow dr, DataRelation rel) { var node = (DTreeNode)Activator.CreateInstance(nodeType); node.Tag = dr; RefreshNode(dr, node); if (fullLoad) { foreach (DataRow row in dr.GetChildRows(rel)) { DTreeNode newNode = Populate(row, rel); node.Nodes.Add(newNode); } } return(node); }
private void LoadSubNodes(DTreeNode nd) { TreeNodeCollection nds = (nd == null) ? Nodes : nd.Nodes; //коллекция нодов, в которую будем загружать string filter = "[" + parentField + "]" + ((nd == null) ? " is null" : "=" + nd.ID); //фильтр, для определения корневых нодов, на текущем уровне string sql = !string.IsNullOrEmpty(queryString) ? queryString : "SELECT * FROM " + tableName; //sql запрос для выборки всех загружаемых нодов if (nd != null) { sql = "DECLARE @L int,@R int\n" + "SELECT @L=" + leftField + ",@R=" + rightField + " FROM " + tableName + " WHERE " + idField + "=" + nd.ID + "\n" + "SELECT * FROM (" + sql + ") AS T1 WHERE @L<=" + leftField + " AND " + rightField + "<=@R ORDER BY " + leftField; } if (string.IsNullOrEmpty(ConnectionString)) { return; } using (var cmd = new SqlDataAdapter(sql, ConnectionString)) using (var ds = new DataSet()) { try { cmd.Fill(ds); DataTable dt = ds.Tables[0]; DataColumn pk, fk; pk = dt.Columns[idField]; fk = dt.Columns[parentField]; var rel = new DataRelation("ParentRelation", pk, fk, false); ds.Relations.Add(rel); DataRow[] drs = dt.Select(filter); for (int i = 0; i < drs.Length; i++) { nds.Add(Populate(drs[i], rel)); } } catch (Exception ex) { MessageBox.Show(ex.Message + "\n\n" + sql); } } }
private void deleteAllItem_Click(object sender, EventArgs e) { DTreeNode node = SelectedNode; if (node != null) { if ( MessageBox.Show("Вы действительно хотите удалить выбранный узел со всеми дочерними узлами?", "Подтверждение удаления", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { if (DeleteSubTree(node)) { node.Remove(); } } } }
private void deleteItem_Click(object sender, EventArgs e) { DTreeNode node = SelectedNode; if (node != null && node.Nodes.Count == 0) { if ( MessageBox.Show("Вы действительно хотите удалить выбранный узел?", "Подтверждение удаления", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { if (Delete(node.ID)) { node.Remove(); } } } }
private bool DeleteSubTree(DTreeNode root) { bool result = true; for (int i = 0; i < root.Nodes.Count; i++) { var node = (DTreeNode)root.Nodes[i]; result = DeleteSubTree(node); if (!result) { break; } } if (result) { result = Delete(root.ID); } return(result); }
private void this_MouseDown(object sender, MouseEventArgs e) { var nd = (DTreeNode)GetNodeAt(e.X, e.Y); var hit = this.HitTest(e.X, e.Y); if (hit.Location == TreeViewHitTestLocations.PlusMinus) { return; } if (hit.Location != TreeViewHitTestLocations.Label && hit.Location != TreeViewHitTestLocations.Image) { nd = null; } if (SelectedNode != nd) { SelectedNode = nd; if (SelectedNode == null) { OnAfterSelect(new TreeViewEventArgs(SelectedNode, TreeViewAction.Unknown)); } } if (allowMove && e.Button.Equals(MouseButtons.Left) && (SelectedNode != null)) { var data = new DataObject(); data.SetData(typeof(string), tableName + ":" + SelectedNode.ID + ":" + SelectedNode.Text); Console.WriteLine("{0}: DoDragDrop", DateTime.Now.ToString("HH:mm:ss fff")); DoDragDrop(data, DragDropEffects.Move); } else if (e.Button.Equals(MouseButtons.Right)) { nd = (DTreeNode)GetNodeAt(e.X, e.Y); if (nd != null) { nd.ForeColor = ForeColor; nd.BackColor = BackColor; } } }
private void this_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { LabelEdit = false; var nd = (DTreeNode)e.Node; if (nd.IsNew) { nd.Text = e.Label; var args = new TreeViewCancelEventArgs(nd, true, TreeViewAction.Unknown); OnAfterNewNodeEdit(args); if (args.Cancel) { if (nd.Parent != null) { SelectedNode = (DTreeNode)nd.Parent; } nd.Remove(); } else { nd.IsNew = false; } } else { if (!string.IsNullOrEmpty(e.Label) && e.Label != e.Node.Text) { var node = (DTreeNode)e.Node; if (!Rename(node.ID, e.Label)) { e.CancelEdit = true; } } else { e.CancelEdit = true; } } }
private void sortItem_Click(object sender, EventArgs e) { // достаем коллекцию узлов текущего уровня DTreeNode node = SelectedNode; TreeNodeCollection nodes = node.Parent != null ? node.Parent.Nodes : Nodes; // первый узел "добавлен" int count = 1; // пока не дошли до конца while (count < nodes.Count) { // следующий узел node = (DTreeNode)nodes[count]; int i; // по всем узлам до текущего for (i = 0; i < count; i++) { var curNode = (DTreeNode)nodes[i]; if (curNode.Text.CompareTo(node.Text) > 0) { break; } } if (i < count) { var curNode = (DTreeNode)nodes[i]; nodes.Remove(node); nodes.Insert(i, node); SortedMove(node.ID, curNode.ID); } count++; } }
public FillNodeEventArgs(DTreeNode nd, DataRow row) { this.nd = nd; this.row = row; }