Пример использования способа «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);

  }

}

 

В результате пользователю стало доступно выполнение следующих действий:

 

  1. Загрузка файлов: