Выберите из БД, делая иконки из предметов - PullRequest
0 голосов
/ 16 июля 2010

То, что я пытаюсь сделать, это то, что показывает эта фотография. альтернативный текст http://a.imageshack.us/img20/9206/foldersrb.jpg

Когда я выбираю что-то из дерева, он передает параметр команде linq, которая выбирает некоторые данные из базы данных. Для каждого элемента в выделении я хочу создать значок и текст, который представляет, является ли элемент папкой или файлом. Когда я нажимаю на значок или ссылку, я хочу, чтобы он делал то же самое, что я бы нажимал на древовидную структуру, передавал параметр команде linq, которая снова выбирает базу данных и заполняет заполнитель.

Способ, которым я делаю это сейчас, состоит в том, чтобы при runtima создать Panel, которая содержит ImageButton и LinkButton. Затем я добавляю панель в ContentPlaceHolder. Проблема в том, что он делает это каждый раз, когда я выбираю что-то новое, а также я не могу заставить его работать, если нажать на иконку или кнопку ссылки, только в виде дерева.

Могу ли я использовать какой-нибудь контроллер и CSS, чтобы получить этот вид значков? Есть ли другой лучший способ?

По сути, это та же система, которую использует проводник в Windows, Treeview показывает только папку, но в окне отображаются папки и файлы. Когда я нажимаю на папку, открывается эта папка, и в главном окне появляются элементы, которые находятся внутри этой папки. Если я щелкаю файл, открывается редактор с содержимым файла.

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Не уверен, что понимаю ваш вопрос на 100%, но я думаю, что понял суть.

Я предполагаю, что сначала вы хотите папки, а затем файлы. Я бы создал два повторителя в этой области: один для кнопок «Изображение папки» и «Ссылка», а другой для кнопок «Изображение файла» и «Ссылка».

Разбейте вашу команду linq на два запроса, один для получения папок и один для файлов. Затем просто привяжите повторители к соответствующим повторителям.

Вот небольшой код для начала работы:

<asp:Repeater ID="rptFolders" runat="server" OnItemCommand="rptFolders_ItemDataBound">
    <ItemTemplate>
        <div>
            <asp:ImageButton ID="btnImage" runat="server" />
            <asp:LinkButton ID="btnLink" runat="server" />
        </div>
    </ItemTemplate>
</asp:Repeater>

И код после звонка DataBind():

protected void rptFolders_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Book book = (Book)e.Item.DataItem; //Or whatever your passing

        ImageButton btnImage = e.Item.FindControl("btnImage");
        LinkButton btnLink = e.Item.FindControl("btnLink");

        btnLink.Text = book.Name;

        btnLink.Click += new EventHandler(FolderClicked);
        btnImage.Click += new ImageClickEventHandler(FolderClicked);
    }
}

Очевидно, что вы можете делать все, что захотите, с Click Events, просто добавив их для хорошей меры.

Я бы, вероятно, создал бы Управление папками и файлами и использовал бы их вместо комбо imagebutton / linkbutton, таким образом я мог бы хранить больше информации о Папке / Файле для последующего доступа к ним, не выполняя другой запрос для получения идентификатора или что нет. Но есть миллион подходов к этому, выберите тот, который вы считаете лучшим.

Дайте мне знать, если вам нужно дополнительное руководство с этим решением или я не понял вашего вопроса.

Счастливое кодирование ...

1 голос
/ 22 июля 2010

Извините пришлось добавить в качестве другого ответа. Вот краткий пример пользовательского элемента управления папкой.

Создайте свой элемент управления ... Форматируйте как хотите.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="FolderButton.ascx.cs" Inherits="FolderButton" %>
<div>
    <asp:ImageButton ID="btnImage" runat="server" ImageUrl="yourfolder.jpg" />
    <asp:LinkButton ID="btnTitle" runat="server" />
</div>

Добавить свойства и событие клика в коде позади (не забудьте запустить событие клика при нажатии кнопок изображения и ссылки):

public partial class FolderButton : System.Web.UI.UserControl
{
    public int DatabaseId { get; set; }
    public string Name { get; set;}  // you can even set your linkbutton text here. 

    public event EventHandler Click;
}

Создайте свой повторитель элементов управления FolderButton:

 <asp:Repeater ID="rptFolders" runat="server" OnItemDataBound="rptFolders_ItemDataBound">
            <ItemTemplate>
                <uc1:FolderButton ID="FolderButton1" runat="server" />
            </ItemTemplate>
        </asp:Repeater>

Установить идентификатор папки для привязки данных:

protected void rptFolders_ItemDataBound(object sender, RepeaterItemEventArgs e)        
{        
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)        
    {        
        Book book = (Book)e.Item.DataItem; //Or whatever your passing        

        FolderButton btnFolder = e.Item.FindControls("FolderButton1");

        btnFolder.Name=book.Name;
        btnFolder.DatabaseId=book.Id;

        btnFolder.Click += new EventHandler(FolderClicked);        
    }        
}     

Наконец, вы можете сделать то, что вы хотите на мероприятии. Нажмите:

     void FolderClicked(object sender, EventArgs e)
{
     int id = ((FolderButton)sender).DatabaseId;

     /// Do something with your Id
}

Дайте мне знать, если что-то неясно. Это просто быстрый пример от руки, так что простите за любые опечатки или плохие практики ... код только для демонстрационных целей.

...