如何将 file/folder 选择器添加到屏幕?
How do I add a file/folder selector to a screen?
我需要一个允许我从用户文件系统 select 文件或文件夹(或两者)的控件。是否有某种控件可以在现有屏幕和新屏幕上使用?
我已将文件选择器和文件夹选择器组合在同一个控件中,但我认为您可以很容易地理解如何执行任一操作。
我已经使用 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 函数来枚举文件和文件夹。要为文件夹或文件专门化控件,您只需要 return 正确的元素。
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)
};
}
}
}
}
}
这是最终结果:
我需要一个允许我从用户文件系统 select 文件或文件夹(或两者)的控件。是否有某种控件可以在现有屏幕和新屏幕上使用?
我已将文件选择器和文件夹选择器组合在同一个控件中,但我认为您可以很容易地理解如何执行任一操作。 我已经使用 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 函数来枚举文件和文件夹。要为文件夹或文件专门化控件,您只需要 return 正确的元素。
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)
};
}
}
}
}
}
这是最终结果: