文件夹内容数据源控件






4.24/5 (12投票s)
这是一个数据源控件,用于列出服务器上文件夹的内容。它非常适合制作文件管理器和照片库。
引言
在 ASP.NET 2.0 中,访问网页中的数据是通过数据源控件处理的。这些是非可视控件,派生自 DataSourceControl
。常见的例子有 SqlDataSource
和 AccessDataSource
。
前段时间,我想做一个简单的文件管理器。为此,我需要列出一个文件夹的内容。我决定创建一个自定义数据源控件,这样我就可以使用 GridView
控件来显示数据。
结合使用 GridView
,该控件不仅可以显示文件夹的内容,还可以用于重命名或删除文件或文件夹!因此,这可以是一个很棒的控件,用于创建您自己的文件管理器。
该控件也可以用于创建照片库,几乎不需要代码,如下所示
代码是用 VB.NET 写的,但将其在 C# 或其他语言中运行并不难。
许可证
该控件是免费的,并且在 LGPL 许可证 下开源。
安装
安装控件
您可以按照标准方式安装该控件
- 在您的网站的应用程序根目录中创建一个 "bin" 文件夹(如果它还不存在)
- 将程序集文件 foldercontentsdatasource.dll 复制到 bin 文件夹中
您可能希望将该控件添加到您的编辑器(Visual Studio 或 C# Builder)的工具箱中。这将允许您通过拖动将控件添加到页面。请按照编辑器的步骤将控件添加到工具箱中。
使用控件
将控件添加到您的页面
有两种方法可以将控件添加到您的页面
- 如果控件已安装在工具箱中,首先将数据控件添加到页面,例如
GridView
、DataList
或Repeater
。接下来,使用数据源配置向导选择数据源。确保 evenlogdatasource.dll 程序集的副本位于 bin 文件夹中。 - 手动添加代码。将此行添加到您的页面顶部
<%@ Register TagPrefix="rw"
Namespace="rw" Assembly="foldercontentsdatasourcecontrol" %>
然后,在您的页面中添加一个像这样的标签
<rw:FolderContentsDataSource
id="FolderContentsDataSource1" runat="server" >
</rw:FolderContentsDataSource>
最后,将数据控件 (GridView
或 DataList
) 添加到页面,并将其连接到 FolderContentsDataSource
。
设置文件夹
该控件将显示设置为 Parameter
的文件夹的内容。参数的名称是 "Directory
"。
<rw:FolderContentsDataSource ID="FolderContentsDataSource1" runat="server" >
<SelectParameters>
<asp:Parameter Name="Directory" Type="String" DefaultValue="c:\inetpub\wwwroot" />
</SelectParameters>
</rw:FolderContentsDataSource>
您可以使用任何 Parameter 类型,例如 ControlParameter
或 QueryStringParameter
,将参数值连接到环境值。在“属性”窗口中使用“参数”设置。请注意,您只需要一个参数。此参数用于选择、删除和重命名内容。
演示页面
该控件附带两个演示页面
- demo.aspx 显示所选文件夹中所有文件和子文件夹的列表。此页面使用
GridView
控件和一个用于选择文件夹的TextBox
控件。Directory
参数通过ControlParameter
设置,后者将TextBox
连接到数据源。 - demogallery.aspx 显示给定文件夹中所有图片的画廊。此页面使用绑定到
FolderContentsDatasource
控件的DataList
控件。使用DataList
的RepeatColumns
属性控制一行中的图片数量。
重要提示:您需要使用具有读取文件夹权限的凭据运行这些页面。对于删除或重命名文件,您需要相应的权限。使用模拟,或确保 ASPNET 帐户可以访问该文件夹。
工作原理
为了构建一个数据源控件,我从 Nikhil Kothari 在 www.nikhilk.net/DataSourceControlsSummary.aspx 的代码中获得了一些想法。我构建了两个主要类:FolderContentsDataSource
和 FolderContentsDataSourceView
。
读取文件夹内容的代码位于 FolderContentsDataSourceView
类的 ExecuteSelect
方法中。此代码生成一个 DataTable
,其中包含给定文件夹中的条目列表
Protected Overrides Function ExecuteSelect(ByVal arguments _
As System.Web.UI.DataSourceSelectArguments) _
As System.Collections.IEnumerable
Dim dt As New DataTable()
dt.Columns.Add("Name", System.Type.GetType("System.String"))
dt.Columns.Add("Size", System.Type.GetType("System.Int64"))
dt.Columns.Add("Modified", System.Type.GetType("System.DateTime"))
dt.Columns.Add("Created", System.Type.GetType("System.DateTime"))
dt.Columns.Add("Accessed", System.Type.GetType("System.DateTime"))
dt.Columns.Add("IsFolder", System.Type.GetType("System.Boolean"))
Dim exc As Exception = Nothing
Dim dv As DataView = Nothing
Try
Dim objFolderContents As DirectoryInfo = _
New DirectoryInfo(_owner.GetSelectedDirectory())
Dim objEntries() As FileSystemInfo = _
objFolderContents.GetFileSystemInfos()
Dim objEntry As FileSystemInfo
For Each objEntry In objEntries
Dim dr As DataRow = dt.NewRow()
dr("Name") = objEntry.Name
If (objEntry.Attributes And FileAttributes.Directory) <> 0 Then
dr("Size") = 0
dr("IsFolder") = True
Else
dr("Size") = CType(objEntry, FileInfo).Length
dr("IsFolder") = False
End If
dr("Modified") = objEntry.LastWriteTime
dr("Created") = objEntry.CreationTime
dr("Accessed") = objEntry.LastAccessTime
dt.Rows.Add(dr)
Next
dv = New DataView(dt)
dv.Sort = arguments.SortExpression
Catch ex As Exception
exc = ex
End Try
Dim statusEventArgs As New FolderContentsDataSourceStatusEventArgs(exc)
OnSelected(statusEventArgs)
If (exc IsNot Nothing And Not statusEventArgs.ExceptionHandled) Then
Throw exc
End If
Return dv
End Function
关注点
- 数据源控件
未来
以下是一些改进的想法
- 设计器支持
如果有人决定扩展此控件,或者有任何意见、错误报告或问题,那么很高兴听到您的声音。