示例#1
0
        /// <summary>
        /// Обновляет подчиненные ветви нода
        /// </summary>
        /// <param name="nd">нод, чьи подчиненные ветви нужно обновить</param>
        public void RefreshSubNodes(DTreeNode nd)
        {
            TreeNodeCollection nds = (nd == null) ? Nodes : nd.Nodes;

            nds.Clear();
            LoadSubNodes(nd);
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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);
                }
            }
        }
示例#4
0
        /// <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);
            }
        }
示例#5
0
        /// <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;
        }
示例#6
0
        /// <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);
        }
示例#7
0
        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;
        }
示例#8
0
        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);
        }
示例#9
0
        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);
                    }
                }
        }
示例#10
0
        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();
                    }
                }
            }
        }
示例#11
0
        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();
                    }
                }
            }
        }
示例#12
0
        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);
        }
示例#13
0
        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;
                }
            }
        }
示例#14
0
        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;
                }
            }
        }
示例#15
0
        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++;
            }
        }
示例#16
0
 public FillNodeEventArgs(DTreeNode nd, DataRow row)
 {
     this.nd  = nd;
     this.row = row;
 }