从数据库中选择,从项目中创建图标

时间:2010-07-16 10:56:13

标签: c# asp.net treeview linkbutton imagebutton

我想要做的是基本上这张照片显示的内容。 alt text http://a.imageshack.us/img20/9206/foldersrb.jpg

当我从树视图中选择某些内容时,它会将参数传递给linq命令,该命令从数据库中选择一些数据。对于选择中的每个项目,我想制作一个Icon和一个文本,表示该项目是文件夹还是文件。 当我按下Icon或Link时,我希望它与我推送树视图一样,将参数传递给linq命令,该命令再次从数据库中选择并填充占位符。

我现在这样做的方法是在runtima上制作一个包含ImageButton和LinkBut​​ton的Panel。然后我将Panel添加到ContentPlaceHolder。 这个问题是每当我选择新的东西时它都会这样做,如果按下图标或链接按钮,我只能从树视图中获取它。

我可以使用一些控制器和CSS来获取图标吗? 还有另一种更好的方法吗?

这与Explorer在Windows中使用的系统基本相同,Treeview仅显示文件夹,但窗口显示文件夹和文件。当我单击文件夹打开的文件夹时,主窗口中填充了该文件夹内的项目。如果我单击一个文件,编辑器会打开文件内容。

2 个答案:

答案 0 :(得分: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);
    }
}

你可以使用点击事件显然做任何你想做的事情,只是添加好的。

我可能会创建一个文件夹和文件控件并使用它们而不是imagebutton / linkbutton组合,这样我就可以存储更多关于文件夹/文件的信息以便以后访问它们,而无需再进行其他查询来获取ID或什么不是。但是有一百万种方法,选择你认为最好的方法。

如果您需要更多有关此解决方案的指导,或者我不理解您的问题,请告诉我们。

快乐编码......

答案 1 :(得分: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控件的Repeater:

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

在DataBinding上设置文件夹ID:

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
}

如果有什么不清楚,请告诉我。这只是一个快速的徒手样本,因此请原谅任何错别字或不良行为......代码仅用于演示目的。