2010-07-16 3 views
0

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

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

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

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

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

ответ

1

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

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

<%@ 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> 

Set Folder Id на DataBinding:

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);   
    }   
}  

Наконец вы можете сделать whever вы хотите на событие Click:

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

    /// Do something with your Id 
} 

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

+0

Хорошо, это выглядит хорошо. Но с помощью этого метода он всегда получал бы пункты снова для каждой страницы правильно? Теперь я просто занимаюсь мозговым штурмом, так или иначе, чтобы сделать тот же запрос для древовидной структуры и представления значков? Скажите, порт для виртуального файла XML и каким-то образом связать его? Или я должен просто отбросить все это из базы данных и сохранить его в сеансе, и просто использовать это, пока кто-то не изменит файлы, тогда я бы выбрал все это снова. – eski

+0

Не уверен, что вы получаете здесь, b/c. Я не знаю всего вашего решения в целом. В зависимости от ваших требований у вас есть много вариантов. Cache, Session, Sql Dependancy Cache, и так далее. Все это зависит от того, насколько ваши данные изменяются между другими факторами (на каждого пользователя, данные уровня приложения и т. Д.). Слишком много факторов, которые можно назвать здесь. Мог бы начать новый вопрос. Дай мне знать. – CkH

2

Не уверен, что я понимаю, что вы задаете вопрос 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); 
    } 
} 

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

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

Сообщите мне, если вам нужно больше руководства с этим решением, или если я не понял ваш вопрос.

Happy Coding ...

+0

Да, вы точно поняли мою проблему. Я собираюсь попробовать этот код завтра. Я думаю, что это намного лучше, чем я сейчас делаю. Что это за папка и управление файлами, о которых вы говорите, как я могу реализовать это для своего решения. Могу ли я использовать это как для дерева, так и для значка? То, как я делаю это сейчас, - это в основном два запроса для одних и тех же данных, один для дерева и переход к значкам. – eski

+0

Для управления папками и изображениями я создавал бы настраиваемый элемент управления для каждого из них, содержащий кнопки с изображением и ссылку, отформатированные так, как вы хотите. Затем вы можете добавить другие свойства в элемент управления (например, ID), если хотите. Или даже сохраните весь объект Book внутри элемента управления. Затем просто установите эти элементы управления в ретрансляторы. Я попытаюсь создать быстрый образец, если вам все еще нужна дополнительная помощь. – CkH

+0

Думаю, я понимаю, о чем вы говорите, но было бы здорово, если бы вы могли сделать пример;) – eski