Reading the support tickets daily it has become one of my most rewarding morning routines. Besides the constant learning factor, I am all the time running into some amazing questions / implementations/ samples that I can put in practice right away.
I have said it before but I will reiterate here:
When presented with a XAF challenge the first thing I do it is a quick search trough the support tickets to see if there is already an implementation that I can adapt to my needs. Most of the time I find something that I can use, but also most of the time I have to actually code it and run it to see if it is exactly what I need it.
If you are like me, you would love to have a visual before getting to deep and realizing I am on the wrong path. I also realize DevExpress receives tons of tickets daily so this is not feasible for them.
Well, this is one of those tickets, more specifically this one:
https://www.devexpress.com/Support/Center/Question/Details/Q408975/multiple-upload-in-xaf
Here, we need to achieve a drag and drop multiple file upload for our Web project.
You can check the source code here but it all comes down to this controller:
public class FileAttachmentsController :ObjectViewController<DetailView, Resume> { public FileAttachmentsController() { TargetViewId = "Resume_DetailView"; } protected XafCallbackManager CallbackManager { get { return ((ICallbackManagerHolder)WebWindow.CurrentRequestPage).CallbackManager; } } protected override void OnViewControlsCreated() { base.OnViewControlsCreated(); ControlViewItem fileAttachmentsControl = (ControlViewItem)View.FindItem("FileAttachmentsControl"); if (fileAttachmentsControl.Control != null) { ASPxUploadControl uploadControl = (ASPxUploadControl)fileAttachmentsControl.Control; uploadControl.UploadMode = UploadControlUploadMode.Advanced; uploadControl.ShowUploadButton = true; uploadControl.AdvancedModeSettings.EnableDragAndDrop = true; uploadControl.AdvancedModeSettings.EnableFileList = true; uploadControl.AdvancedModeSettings.EnableMultiSelect = true; uploadControl.FilesUploadComplete += UploadControl_FilesUploadComplete; uploadControl.ClientSideEvents.FilesUploadStart = "function (s, e) { e.cancel = !confirm('All changes will be saved to the database. Continue?'); }"; string callbackScript = CallbackManager.GetScript(); uploadControl.ClientSideEvents.FilesUploadComplete = $"function(s, e) {{ {callbackScript} }}"; } } private void UploadControl_FilesUploadComplete(object sender, FilesUploadCompleteEventArgs e) { ASPxUploadControl uploadControl = (ASPxUploadControl)sender; foreach (UploadedFile uploadedFile in uploadControl.UploadedFiles) { PortfolioFileData fileData = ObjectSpace.CreateObject<PortfolioFileData>(); fileData.Resume = ViewCurrentObject; fileData.DocumentType = DocumentType.Unknown; fileData.File = ObjectSpace.CreateObject<FileData>(); fileData.File.LoadFromStream(uploadedFile.FileName, uploadedFile.FileContent); } ObjectSpace.CommitChanges(); } }
In the OnViewControlsCreated we configure the ASPxUploadControl to enable Drag and Drop, MultiSelect etc and in the FilesUploadComplete event we create a PortfolioFileData object for each uploaded file and that is it.
See it in action:
Until next time, XAF out!
I really feel ashamed to read how simple the solution is. I’ve been pondering for years on how to get this done. Thanks a million!