Beispiel #1
0
        public TreeNode[] Root = new TreeNode[0]; // корни деревьев

        #endregion Fields

        #region Constructors

        public Tree(CompositionRow[] RowsData)
        {
            /*// фомируем корень дерева
            Root = new TreeNode(RowsData[0].RootCode, 0, 0, 0);
            // удаляем строку вставленную в дерево в корень из массива
            //CompositionRow[] NewRowsData = GlobalFunctions.TrimArray(RowsData, 0);
            // запускаем цикличный (рекурсивный) алгоритм построения дерева
            BuiltTree(Root, RowsData, RowsData[0].RootCode);
            // отметим флаг построения дерева
            IsBuild = true;*/

            // 1. Ищем все корни для деревьев и создаем их
            // определяем количество корней
            int count = 0;
            long[] RootCodes = GetRootsCount(ref count, RowsData);
            // создаем массив корней
            int i;
            for (i = 0; i < RootCodes.Length; i++)
            {
                AddRoot(new TreeNode(RootCodes[i], 0, 0, 0));
            }
            // 2. Для каждого изделия (корня) строим дерево
            for (i = 0; i < Root.Length; i++)
            {
                // запускаем цикличный (рекурсивный) алгоритм построения дерева
                BuiltTree(Root[i], RowsData, Root[i].PRootCode);
            }
            // 3. Отметим флаг построения дерева
            IsBuild = true;
        }
Beispiel #2
0
 /// <summary>
 /// Рекурсивный метод построения дерева
 /// </summary>
 /// <param name="root">Корень для текущей итерации</param>
 /// <param name="RowsData">Строки таблицы СИ для построения дерева</param>
 /// <param name="parent">Код родительского узла</param>
 public void BuiltTree(TreeNode root, CompositionRow[] RowsData, long parent)
 {
     for (int i = 0; i < RowsData.Length; i++)
         if (RowsData[i].WhereCode == parent)
         {
             TreeNode node = new TreeNode(RowsData[i].RootCode, RowsData[i].WhereCode, RowsData[i].WhatCode, RowsData[i].Count);
             int ind = root.AddNode(node);
             BuiltTree(root[ind], RowsData, root[ind].PProductCodeWhat);
         }
 }
Beispiel #3
0
 /// <summary>
 /// Проверка коррекстности вставляемых в таблицы данных по ключам
 /// </summary>
 /// <param name="dtp">Таблица с уже имеющимися данными</param>
 /// <param name="row">Строка с данными для проверки</param>
 /// <returns>Возвращает true если данные уже есть, иначе false</returns>
 private bool CheckCorrect(DataTable dtp, CompositionRow row)
 {
     bool flag = false;
     for (int i = 0; i < dtp.Rows.Count; i++)
     {
         if (dtp.Rows[i].Field<long>(0) == row.RootCode && dtp.Rows[i].Field<long>(1) == row.WhereCode && dtp.Rows[i].Field<long>(2) == row.WhatCode)
         {
             flag = true;
             break;
         }
     }
     return flag;
 }
Beispiel #4
0
 public AddCompositionRowForm(FormType ftype, CompositionRow data)
 {
     InitializeComponent();
     switch (ftype)
     {
         case FormType.ADDFORM:
             this.Text = "Добавление записи в таблицу";
             break;
         case FormType.EDITFORM:
             this.Text = "Редактирование записи";
             break;
     }
     FType = ftype;
     InitializeData();
     LoadDataToControls(data);
 }
Beispiel #5
0
 /// <summary>
 /// Функция для уменьшения (обрезки) массива из строк ТБД CИ по индексу
 /// </summary>
 /// <param name="Rows">Массив строк таблицы Состав изделий</param>
 /// <param name="ind">Индекс элмента массива, который необходимо удалить</param>
 /// <returns>Новый массив строк таблицы меньший на одну запись, чем входной</returns>
 public static CompositionRow[] TrimArray(CompositionRow[] Rows, int ind)
 {
     CompositionRow[] comp = new CompositionRow[Rows.Length - 1];
     int k = 0;
     for (int i = 0; i < Rows.Length; i++)
     {
         if (i != ind)
         {
             comp[k] = Rows[i];
             k++;
         }
     }
     return comp;
 }
Beispiel #6
0
        public static CompositionRow ConvertRowInfoToCompositionRow(GridViewRowInfo row)
        {
            CompositionRow res = new CompositionRow();

            res.RootCode = (long)row.Cells[0].Value;
            res.WhereCode = (long)row.Cells[1].Value;
            res.WhatCode = (long)row.Cells[2].Value;
            res.Count = Convert.ToInt32(row.Cells[3].Value);

            return res;
        }
Beispiel #7
0
        public static CompositionRow[] ConvertDataTableToCompositionRow(DataTable dt)
        {
            CompositionRow[] res = new CompositionRow[dt.Rows.Count];

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                res[i].RootCode = dt.Rows[i].Field<long>(0);
                res[i].WhereCode = dt.Rows[i].Field<long>(1);
                res[i].WhatCode = dt.Rows[i].Field<long>(2);
                res[i].Count = Convert.ToInt32(dt.Rows[i].ItemArray.GetValue(3));
            }

            return res;
        }
Beispiel #8
0
 public static DatabaseLib.ParametersCollection ConvertCompositionRowToParameters(CompositionRow row)
 {
     DatabaseLib.ParametersCollection par = new DatabaseLib.ParametersCollection();
     par.Add("RootCode", row.RootCode, DbType.UInt64);
     par.Add("WhereCode", row.WhereCode, DbType.UInt64);
     par.Add("WhatCode", row.WhatCode, DbType.UInt64);
     par.Add("Count", row.Count, DbType.UInt32);
     return par;
 }
Beispiel #9
0
 // кнопка ОК
 private void okButton_Click(object sender, EventArgs e)
 {
     if (radMultiColumnComboBox1.SelectedIndex < 0 || radMultiColumnComboBox2.SelectedIndex < 0 ||
         radMultiColumnComboBox3.SelectedIndex < 0 || radTextBox1.Text != "")
     {
         CompositionRow row = new CompositionRow();
         row.RootCode = Convert.ToInt64(radMultiColumnComboBox1.EditorControl.Rows[radMultiColumnComboBox1.SelectedIndex].Cells[0].Value);
         row.WhereCode = Convert.ToInt64(radMultiColumnComboBox2.EditorControl.Rows[radMultiColumnComboBox2.SelectedIndex].Cells[0].Value);
         row.WhatCode = Convert.ToInt64(radMultiColumnComboBox3.EditorControl.Rows[radMultiColumnComboBox3.SelectedIndex].Cells[0].Value);
         row.Count = Convert.ToInt32(radTextBox1.Text);
         switch (FType)
         {
             case FormType.ADDFORM:
                 // проверка корректности вставки данных
                 if (!CheckCorrect(dtp, row))
                 {
                     // вставка данных в таблицу
                     DBWorker.InsertDataRowToTable("СИ", row);
                     //DatabaseLib.ParametersCollection par = Converter.ConvertCompositionRowToParameters(row);
                     //DBWorker.dbf.Insert("CompositionProducts", par);
                 }
                 else
                     MessageBox.Show("Вставляемые данные должны быть уникальными! Уже есть строка в таблице с такими данными!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 break;
             case FormType.EDITFORM:
                 DatabaseLib.ParametersCollection par = Converter.ConvertCompositionRowToParameters(row);
                 string where = String.Format("(RootCode = {0}) and (WhereCode = {1}) and (WhatCode = {2})",
                                              row.RootCode, row.WhereCode, row.WhatCode);
                 DBWorker.UpdateRow("CompositionProducts", where, par);
                 break;
         }
         this.DialogResult = DialogResult.OK;
         this.Close();
     }
     else
         MessageBox.Show("Не верно введены данные или не заданы совсем!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
Beispiel #10
0
 // загрузка данных из выбранной строки в таблице для редактирования
 private void LoadDataToControls(CompositionRow data)
 {
     // размещение соответствия данных из выбранной строки таблицы СИ
     int i;
     for (i = 0; i < radMultiColumnComboBox1.EditorControl.Rows.Count; i++)
         if (Convert.ToInt64(radMultiColumnComboBox1.EditorControl.Rows[i].Cells[0].Value) == data.RootCode)
         {
             radMultiColumnComboBox1.SelectedIndex = i;
             break;
         }
     for (i = 0; i < radMultiColumnComboBox2.EditorControl.Rows.Count; i++)
         if (Convert.ToInt64(radMultiColumnComboBox2.EditorControl.Rows[i].Cells[0].Value) == data.WhereCode)
         {
             radMultiColumnComboBox2.SelectedIndex = i;
             break;
         }
     for (i = 0; i < radMultiColumnComboBox3.EditorControl.Rows.Count; i++)
         if (Convert.ToInt64(radMultiColumnComboBox3.EditorControl.Rows[i].Cells[0].Value) == data.WhatCode)
         {
             radMultiColumnComboBox3.SelectedIndex = i;
             break;
         }
     radTextBox1.Text = data.Count.ToString();
 }
Beispiel #11
0
        /// <summary>
        /// Загрузка данных из файла для таблицы "Состав изделий"
        /// </summary>
        /// <param name="fname">Полный путь к файлу, содержащим данные для таблицы</param>
        /// <returns>Возвращает массив структур CompositionRow</returns>
        public static CompositionRow[] LoadDataForCompositionProducts(string fname)
        {
            StreamReader file = new StreamReader(fname);
            int count = 0;
            string[] mas = new string[0];
            while (!file.EndOfStream)
            {
                string str = file.ReadLine();
                count++;
                Array.Resize(ref mas, count);
                mas[count - 1] = str;
            }
            file.Close();

            CompositionRow[] comp = new CompositionRow[count];
            for (int i = 0; i < count; i++)
            {
                string[] tmp = mas[i].Split('\t');
                comp[i].RootCode = Convert.ToInt64(tmp[0]);
                comp[i].WhereCode = Convert.ToInt64(tmp[1]);
                comp[i].WhatCode = Convert.ToInt64(tmp[2]);
                comp[i].Count = Convert.ToInt32(tmp[3]);
            }

            return comp;
        }
Beispiel #12
0
 /// <summary>
 /// Поиск количества корневых узлов по входным данным таблице ПП
 /// </summary>
 /// <param name="count">Возвращает количество найденных уникальных корней</param>
 /// <param name="RowsData">Исходная таблица с данными</param>
 /// <returns>Возвращает коды найденных корней деревьев</returns>
 public long[] GetRootsCount(ref int count, CompositionRow[] RowsData)
 {
     long[] RootCodes = new long[0];
     int i;
     // добавим первый узел, для начала
     Array.Resize(ref RootCodes, 1);
     RootCodes[0] = RowsData[0].RootCode;
     count++;
     for (i = 1; i < RowsData.Length; i++)
     {
         if (!IsIt(RootCodes, RowsData[i].RootCode)) // если нет узла с корневым кодом уже, то добавим его
         {
             Array.Resize(ref RootCodes, RootCodes.Length + 1);
             RootCodes[RootCodes.Length - 1] = RowsData[i].RootCode;
             count++;
         }
     }
     return RootCodes;
 }