2016-10-18 2 views

답변

3

나는 파일과 폴더 선택기를 같은 컨트롤에 결합했는데 둘 중 하나를 수행하는 방법을 쉽게 이해할 수 있다고 생각합니다. SOOrderEntry의 확장을 사용하여 예제를 만들었지 만 새 화면이나 다른 기존 스크린과 동일한 원리입니다. PXDataSource 요소

, 다음과 Datatrees 및 PXTreeDataMember 요소를 추가

<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" TypeName="PX.Objects.SO.SOOrderEntry" PrimaryView="Document"> 
     <DataTrees> 
      <px:PXTreeDataMember TreeView="FilesTree" TreeKeys="FileKey" /> 
     </DataTrees> 
</px:PXDataSource> 

를 formView 소자에서 PXTreeSelector를 추가

<px:PXFormView ID="PXFormView2" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" DataMember="Document" Caption="Order Summary" 
    NoteIndicator="True" FilesIndicator="True" LinkIndicator="True" EmailingGraph="PX.Objects.CR.CREmailActivityMaint,PX.Objects" 
    ActivityIndicator="True" ActivityField="NoteActivity" DefaultControlID="edOrderType" NotifyIndicator="True" 
    TabIndex="14900"> 
    <Template> 
     <px:PXTreeSelector runat="server" TreeDataSourceID="ds" TreeDataMember="FilesTree" InitialExpandLevel="0" MinDropWidth="413" PopulateOnDemand="True" ShowRootNode="False" AllowEditValue="True" SelectOnFocus="False" DataField="ParentFolder" ID="edPathSelector"> 
      <DataBindings> 
       <px:PXTreeItemBinding DataMember="FilesTree" TextField="FileName" ValueField="FilePath" DescriptionField="FilePath" ImageUrlField="Icon" /> 
      </DataBindings> 
     </px:PXTreeSelector> 
    </Template> 
</px:PXFormView> 

여기 내 DAC 및 그래프 확장이다. 보시다시피 그래프는 열거 형 파일과 폴더에 .NET 함수를 호출하는 것만을 보여줍니다. 폴더 나 파일에 대한 컨트롤을 특수화하려면 올바른 요소를 반환하면됩니다.

Final result

: 여기
using PX.Data; 
using PX.Web.UI; 
using System; 
using System.Collections; 
using System.IO; 
using System.Linq; 

namespace PX.Objects.SO 
{ 
    [Serializable] 
    public class RowFilesTree : IBqlTable 
    { 
     [PXString(IsKey = true, IsUnicode = true)] 
     [PXUIField(DisplayName = "FileKey")] 
     public string FileKey { get; set; } 
     public class fileKey : IBqlField { } 


     [PXString] 
     [PXUIField(DisplayName = "Path")] 
     public string FilePath { get; set; } 
     public class filePath : IBqlField { } 


     [PXString] 
     [PXUIField(DisplayName = "Name")] 
     public string FileName { get; set; } 
     public class fileName : IBqlField { } 

     [PXString(250)] 
     public virtual string Icon { get; set; } 
     public abstract class icon : IBqlField {} 
    } 


    public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry> 
    { 
     public PXSelect<RowFilesTree> FilesTree; 
     protected virtual IEnumerable filesTree([PXString]string FilePath) 
     { 
      if (string.IsNullOrEmpty(FilePath)) 
      { 
       var folders = Directory.GetLogicalDrives(); 
       foreach (var folder in folders) 
       { 
        yield return new RowFilesTree() 
        { 
         FileKey = folder.Replace(':', '>'), 
         FileName = folder, 
         FilePath = folder, 
         Icon = Sprite.Tree.GetFullUrl(Sprite.Tree.Folder) 
        }; 
       } 
      } 
      else 
      { 
       var folders = new string[0]; 
       var files = new string[0]; 

       try 
       { 
        var decode = FilePath.Replace('>', ':'); 
        folders = Directory.GetDirectories(decode); 
        files = Directory.GetFiles(decode); 

       } 
       catch 
       { 
       } 

       foreach (var folder in folders) 
       { 
        yield return new RowFilesTree() 
        { 
         FileKey = folder.Replace(':', '>'), 
         FileName = Path.GetFileName(folder), 
         FilePath = folder, 
         Icon = Sprite.Tree.GetFullUrl(Sprite.Tree.Folder) 
        }; 
       } 


       foreach (var file in files) 
       { 
        yield return new RowFilesTree() 
        { 
         FileKey = file.Replace(':', '>'), 
         FileName = Path.GetFileName(file), 
         FilePath = file, 
         Icon = Sprite.Tree.GetFullUrl(Sprite.Tree.Leaf) 
        }; 
       } 
      } 
     } 
    } 
} 

최종 결과
관련 문제