65.9K
CodeProject 正在变化。 阅读更多。
Home

文件夹内容数据源控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.24/5 (12投票s)

2006年11月20日

LGPL3

3分钟阅读

viewsIcon

95032

downloadIcon

736

这是一个数据源控件,用于列出服务器上文件夹的内容。它非常适合制作文件管理器和照片库。

Sample Image - screenshot.gif

引言

在 ASP.NET 2.0 中,访问网页中的数据是通过数据源控件处理的。这些是非可视控件,派生自 DataSourceControl。常见的例子有 SqlDataSourceAccessDataSource

前段时间,我想做一个简单的文件管理器。为此,我需要列出一个文件夹的内容。我决定创建一个自定义数据源控件,这样我就可以使用 GridView 控件来显示数据。

结合使用 GridView,该控件不仅可以显示文件夹的内容,还可以用于重命名或删除文件或文件夹!因此,这可以是一个很棒的控件,用于创建您自己的文件管理器。

该控件也可以用于创建照片库,几乎不需要代码,如下所示

代码是用 VB.NET 写的,但将其在 C# 或其他语言中运行并不难。

许可证

该控件是免费的,并且在 LGPL 许可证 下开源。

安装

安装控件

您可以按照标准方式安装该控件

  • 在您的网站的应用程序根目录中创建一个 "bin" 文件夹(如果它还不存在)
  • 将程序集文件 foldercontentsdatasource.dll 复制到 bin 文件夹中

您可能希望将该控件添加到您的编辑器(Visual Studio 或 C# Builder)的工具箱中。这将允许您通过拖动将控件添加到页面。请按照编辑器的步骤将控件添加到工具箱中。

使用控件

将控件添加到您的页面

有两种方法可以将控件添加到您的页面

  1. 如果控件已安装在工具箱中,首先将数据控件添加到页面,例如 GridViewDataListRepeater。接下来,使用数据源配置向导选择数据源。确保 evenlogdatasource.dll 程序集的副本位于 bin 文件夹中。
  2. 手动添加代码。将此行添加到您的页面顶部
  3. <%@ Register TagPrefix="rw" 
       Namespace="rw" Assembly="foldercontentsdatasourcecontrol" %>

    然后,在您的页面中添加一个像这样的标签

    <rw:FolderContentsDataSource 
         id="FolderContentsDataSource1" runat="server" >
    </rw:FolderContentsDataSource>

    最后,将数据控件 (GridViewDataList) 添加到页面,并将其连接到 FolderContentsDataSource

设置文件夹

该控件将显示设置为 Parameter 的文件夹的内容。参数的名称是 "Directory"。

<rw:FolderContentsDataSource ID="FolderContentsDataSource1" runat="server" >
   <SelectParameters>
      <asp:Parameter Name="Directory" Type="String" DefaultValue="c:\inetpub\wwwroot" />
   </SelectParameters>
</rw:FolderContentsDataSource>

您可以使用任何 Parameter 类型,例如 ControlParameterQueryStringParameter,将参数值连接到环境值。在“属性”窗口中使用“参数”设置。请注意,您只需要一个参数。此参数用于选择、删除和重命名内容。

演示页面

该控件附带两个演示页面

  • demo.aspx 显示所选文件夹中所有文件和子文件夹的列表。此页面使用 GridView 控件和一个用于选择文件夹的 TextBox 控件。 Directory 参数通过 ControlParameter 设置,后者将 TextBox 连接到数据源。
  • demogallery.aspx 显示给定文件夹中所有图片的画廊。此页面使用绑定到 FolderContentsDatasource 控件的 DataList 控件。使用 DataListRepeatColumns 属性控制一行中的图片数量。

重要提示:您需要使用具有读取文件夹权限的凭据运行这些页面。对于删除或重命名文件,您需要相应的权限。使用模拟,或确保 ASPNET 帐户可以访问该文件夹。

工作原理

为了构建一个数据源控件,我从 Nikhil Kothari 在 www.nikhilk.net/DataSourceControlsSummary.aspx 的代码中获得了一些想法。我构建了两个主要类:FolderContentsDataSourceFolderContentsDataSourceView

读取文件夹内容的代码位于 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

关注点

  • 数据源控件

未来

以下是一些改进的想法

  • 设计器支持

如果有人决定扩展此控件,或者有任何意见、错误报告或问题,那么很高兴听到您的声音。

© . All rights reserved.