Пример использования способа «Drag & Drop» для работы с файлами
Способ «Drag & Drop» применяется для ускорения процесса загрузки/выгрузки файлов и повышения удобства работы пользователей с системой.
Как известно, в платформе Sherp предусмотрен встроенный функционал для настройки перетаскивания объектов между элементами информационной системы (браузерами, пользовательскими формами и др.). Например, такая возможность доступна на вкладке «DragDrop» окна редактирования формы окна списка («Browser»).
Но часто возникают ситуации, когда необходимо осуществлять перенос объектов из внешних источников, например, файлов с жёсткого диска на компьютере пользователя.
В нашем примере требовалось реализовать возможность перетаскивания файлов на пункте меню «Файлы» карточки информационного объекта «Проект», с целью прикрепления к проекту файлов с жёсткого диска и их последующей выгрузки.
Для решения этой задачи была разработана пользовательская форма, которая была включена в состав Браузера в качестве панели:
При этом, используя встроенное в Платформу средство разработки пользовательских форм, был написан программный код, обеспечивающий логику выполнения «Drag & Drop»:
// Обработчик события DragEnter формы
private void Form_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
try
{
// Если на форму перетаскиваются файлы
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.Copy;
this.BackColor = Color.LightGreen;
}
// Если на форму перетаскиваются объекты из элемента Платформы
else if (e.Data.GetDataPresent(typeof(Client.Common.Config.DragDropObject)))
{
Client.Common.Config.DragDropObject ddo = (Client.Common.Config.DragDropObject)e.Data.GetData(typeof(Client.Common.Config.DragDropObject));
DataTable dt = new DataTable();
dt.Columns.Add("FileName", typeof(string));
dt.Columns.Add("FileBody", typeof(byte[]));
// Заполнение таблицы dt именами и образами файлов из прикладной системы, реализация зависит от конкретной прикладной системы
foreach (DataRow r in ddo.Table.Rows)
{
string fileName = r["FileName"].ToString();
string fileExt = r["Extension"].ToString();
string fileNameWithExt = System.IO.Path.ChangeExtension(fileName, fileExt);
DataTable dtFiles = GetFiles(r["IDFileRecord"], r["IDLinkRole"]);
if (dtFiles.Rows.Count > 0)
{
DataRow rr = dtFiles.Rows[0];
string sss = GetFile(rr["IDFileBody"], fileName, fileExt, string.Empty);
byte[] fileBody = System.IO.File.ReadAllBytes(sss);
System.IO.File.Delete(sss);
dt.Rows.Add(fileNameWithExt, fileBody);
}
}
// -------------------------------------
Client.Common.WindowsShellDragDrop wsdd = new Client.Common.WindowsShellDragDrop() { isOwnDragDrop = true };
wsdd.FilesDataSet(sender, dt);
e.Effect = DragDropEffects.Copy;
}
else {
e.Effect = DragDropEffects.None;
}
}
catch (Exception ex)
{
e.Effect = DragDropEffects.None;
MessageBox.Show("Произошла ошибка при Drag&Drop. " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// Обработка события DragDrop формы
private void Form_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
try {
//Загрузка файлов извне
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.Copy;
var fileNames = (string[])e.Data.GetData(DataFormats.FileDrop, false);
if (fileNames.Length > 0)
{
// Реализация загрузки файлов для конкретной прикладной системы
Guid? idObject = this.IdObject;
if (idObject.HasValue)
{
string prompt = "Вы собираетесь загрузить следующие файлы:" + Environment.NewLine;
foreach (string fn in fileNames)
{
prompt += " - " + System.IO.Path.GetFileName(fn) + Environment.NewLine;
}
prompt += Environment.NewLine+ "Загрузить эти файлы?";
if (MessageBox.Show(prompt, "Загрузка файлов", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
{
object[] par = new object[] { fileNames, idObject.Value, 1, null };
Client.Common.UserForm.RunMethod(Guid.Parse("5F891FAD-6B8D-4BB9-8984-C636431A6F11"), "AddFiles", ref par, null);
Client.Common.Func.RefreshBrowser(Guid.Parse("0B97B629-F95D-456C-92A1-E740DB931D0D"), null);
}
}
else MessageBox.Show("В форму не передан ИД объекта. Обратитесь к разработчику", "Не удалось загрузить файлы", MessageBoxButtons.OK, MessageBoxIcon.Error);
// ------------------------------------
}
}
}
catch (Exception ex)
{
e.Effect = DragDropEffects.None;
MessageBox.Show("Ошибка добавления файлов. " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
В результате пользователю стало доступно выполнение следующих действий:
Загрузка файлов:
Выгрузка файлов:
Данный пример вы можете использовать для реализации аналогичных функций в собственных информационных системах, разработанных на базе платформы Sherp.
0 комментариев