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; }
/// <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); } }
/// <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; }
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); }
/// <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; }
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; }
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; }
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; }
// кнопка ОК 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); }
// загрузка данных из выбранной строки в таблице для редактирования 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(); }
/// <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; }
/// <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; }