internal void Paste() { //Вставка объекта из буфера if (PasteOptions.PasteObject) { if (Clipboard.GetData(typeof(ClipboardData).FullName) is ClipboardData data && data.GetObject(ItemsCollection.SourceItemType, true) is List <object> items && items.Count > 0) { InsertItems(null, items, data.DropLevel, FocusItem); return; } } //Преобразование текста из буфера в объекты if (PasteOptions.ParseText) { string str = Clipboard.GetDataObject()?.GetData(DataFormats.UnicodeText) as string; Type itemType = ItemsCollection.SourceItemType; if (String.IsNullOrEmpty(str) || itemType == null || itemType.GetInterface(typeof(ITableRow).FullName) == null) { return; } string[] preArr = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); string[][] tableArr = new string[preArr.Length][]; for (int i = 0; i < preArr.Length; i++) { tableArr[i] = preArr[i].Split('\t'); } int[] dropLevels = new int[preArr.Length]; bool isSetLevels = ItemsCollection.SourceItemsIsIChildCollection; if (isSetLevels) { for (int i = 0; i < tableArr.Length; i++) { if (tableArr[i].Length > 0) { if (Int32.TryParse(tableArr[i][0], out int droplevel) && droplevel >= 0) { dropLevels[i] = droplevel; } else { isSetLevels = false; break; } } } } int level = int.MaxValue; List <object> items = new List <object>(); if (isSetLevels) { if (dropLevels.Length > 0) { level = dropLevels[0]; } List <object> lasLevels = new List <object>(); for (int i = 0; i <= level; i++) { lasLevels.Add(null); } for (int i = 0; i < tableArr.Length; i++) { object obj = Activator.CreateInstance(itemType); ITableRow ti = obj as ITableRow; for (int j = 1; j < tableArr[i].Length; j++) { ti.SetValue(j - 1, tableArr[i][j]?.Trim()); } if (dropLevels[i] == level) { items.Add(ti); lasLevels[level] = ti; } else { if (lasLevels.Count > dropLevels[i] - 1) { (lasLevels[dropLevels[i] - 1] as IChildCollection)?.Add(ti); } if (dropLevels[i] < lasLevels.Count) { lasLevels[dropLevels[i]] = ti; } else if (dropLevels[i] == lasLevels.Count) { lasLevels.Add(ti); } } } } else { level = 1; for (int i = 0; i < tableArr.Length; i++) { object obj = Activator.CreateInstance(itemType);; ITableRow ti = obj as ITableRow; for (int j = 0; j < tableArr[i].Length; j++) { ti.SetValue(j, tableArr[i][j]?.Trim()); } items.Add(ti); } } if (items.Count > 0) { InsertItems(null, items, level, FocusItem); return; } } }