Сетка фильтра DirectoryInfo GetFiles()

Я работаю над страницей, на которой отображаются файлы PDF в определенном каталоге в сетке вместе со ссылкой на файл.

Я изменяю пример Скотта Митчелла здесь: http://aspnet.4guysfromrolla.com/articles/052803-1.aspx

Я преобразовал код из vb в c #.

<%@ Import Namespace="System.IO" %>
<script language="C#" runat="server">
public void Page_Load(object sender, EventArgs e)
{
DirectoryInfo dirInfo = new DirectoryInfo(Server.MapPath(""));

articleList.DataSource = dirInfo.GetFiles("*.pdf");
articleList.DataBind();
}
</script>

<asp:DataGrid runat="server" id="articleList" Font-Name="Verdana"
AutoGenerateColumns="False" AlternatingItemStyle-BackColor="#eeeeee"
HeaderStyle-BackColor="Navy" HeaderStyle-ForeColor="White"
HeaderStyle-Font-Size="15pt" HeaderStyle-Font-Bold="True">
<Columns>
<asp:HyperLinkColumn DataNavigateUrlField="Name" DataTextField="Name" 
       HeaderText="File Name" target="_blank"/>
<asp:BoundColumn DataField="LastWriteTime" HeaderText="Last Write Time"
    ItemStyle-HorizontalAlign="Center" DataFormatString="{0:d}" />
</Columns>
</asp:DataGrid>

Приведенный выше код работает при отображении файлов. Что я хотел бы сделать сейчас, так это добавить фильтрацию сетки.

Имя файла отображается в сетке как ссылка на pdf. Как добавить текстовое поле, позволяющее фильтровать/искать определенное имя файла или имя файла, начинающееся с __?

Кроме того, можно ли запретить браузеру кэшировать PDF-файл, поскольку все, что делает моя страница, - это ссылка на него?

Любая помощь или идеи будут оценены.

Спасибо.


person Jack    schedule 18.03.2013    source источник


Ответы (2)


Попробуйте, как показано ниже, это поможет вам ....

В представлении «Дизайн HTML» перед тем, как DataGridView добавит приведенный ниже код, будет создано текстовое поле и кнопка.

HTML:

    Enter the Name of the file : <asp:TextBox ID="txtFilter" runat="server"></asp:TextBox>
        <asp:Button ID="btnShow"
            runat="server" Text="ShowData" onclick="btnShow_Click" />

Добавить событие нажатия кнопки, как показано ниже...

CS:

        protected void btnShow_Click(object sender, EventArgs e)
        {
         ShowData();
        }

        public void ShowData()
        {
            string FilterValue = txtFilter.Text.ToUpper();
            DirectoryInfo dirInfo = new DirectoryInfo(Server.MapPath(""));

            FileInfo[] info = dirInfo.GetFiles("*.zip");            //Get FileInfo and Save it a FileInfo[] Array

            List<Getfiles> _items = new List<Getfiles>();          // Define a List with Two coloums

            foreach (FileInfo file in info) //Loop the FileInfo[] Array
               _items.Add(new Getfiles { Name = file.Name, LastWriteTime = file.LastWriteTime.ToString("MM/dd/yyyy") });  // Save the Name and LastwriteTime to List


           //you can use Any one the Filtered list from the below...

            var tlistFiltered = _items.Where(item => item.Name.ToUpper() == FilterValue); // Find the File by their File Name
            var tlistFiltered1 = _items.Where(item => item.Name.ToUpper().Contains(FilterValue)); // Find the file that Contains Specific word in its File Name
            var tlistFiltered2 = _items.Where(item => item.Name.ToUpper().StartsWith(FilterValue));// Find tha File that StartsWith Some Specific Word


            articleList.DataSource = tlistFiltered; //Assign the DataSource to DataGrid
            articleList.DataBind();

        }

        public class Getfiles
        {
            public string Name { get; set; }
            public string LastWriteTime { get; set; }
        }

Экран вывода:

введите здесь описание изображения

person Pandian    schedule 18.03.2013
comment
Это помогает. Фильтр работает, но как я могу фильтровать с помощью текстового поля ввода? Спасибо за пример кода. Очень полезно. - person Jack; 18.03.2013
comment
Я думаю, что я что-то упускаю. С изменениями, которые вы рекомендовали, страница не использует ввод текстового поля, а использует FilterValue из var tlistFiltered1 = _items.Where(item => item.Name.Contains("FilterValue"));. Как я могу определить FilterValue из текстового поля? - person Jack; 18.03.2013
comment
@Jack: Извините, добавьте строку FilterValue = txtFilter.Text; и удалите двойные кавычки и попробуйте то же самое... Теперь я отредактировал свой код.... - person Pandian; 18.03.2013
comment
Это сделало это. Спасибо за вашу помощь. - person Jack; 18.03.2013
comment
У меня есть еще одна проблема, с которой я бы хотел, чтобы вы помогли. Как я могу поместить файлы в подкаталог? Когда я добавляю /files вот так: Server.MapPath(/files) в сетке отображаются имена файлов, расположенных в /files вот так: RootFolder/files/aPDF.pdf, но ссылка указывает на корневую папку Rootfolder/aPDF.pdf. Какие-нибудь мысли? - person Jack; 19.03.2013
comment
Прошу прощения за появление новых элементов после того, как я отметил ваш ответ, но можно ли убрать чувствительность к регистру из фильтра? - person Jack; 19.03.2013
comment
давайте продолжим это обсуждение в чате - person Pandian; 19.03.2013

Вы можете попробовать использовать ObjectDataSource, а затем передать его в свой DataGrid. Источник данных объекта будет обертывать вызовы информации о каталоге.

Если у вас есть ObjectDataSource, вы сможете использовать встроенные в DataGrid функции фильтрации и сортировки.

У Скотта Митчела есть несколько руководств по этому вопросу:

http://msdn.microsoft.com/en-us/library/aa581784.aspx

А вот один для использования Sql, но вы сможете легко адаптировать его для извлечения списка файлов:

http://asp-net-example.blogspot.nl/2008/11/aspnet-gridview-and-objectdatasource.html

person Philip Pittle    schedule 18.03.2013