0

我想要做的基本上就是这张照片所显示的。 替代文字

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

我现在这样做的方式是在runtima 制作一个包含ImageButton 和LinkBut​​ton 的面板。然后我将面板添加到 ContentPlaceHolder。每次我选择新的东西时它都会这样做的问题,如果按下图标或链接按钮,我也无法让它工作,只有来自树视图。

我可以使用一些控制器和 css 来获得图标的外观吗?还有其他更好的方法吗?

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

4

2 回答 2

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

显然,您可以使用 Click Events 做任何您想做的事情,只需将它们添加进去就可以了。

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

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

快乐的编码...

于 2010-07-21T18:55:54.757 回答
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>

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

最后,您可以在事件 Click 上做任何您想做的事情:

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

     /// Do something with your Id
}

让我知道是否有任何不清楚的地方。这只是一个快速的手绘示例,因此请原谅任何拼写错误或不良做法……代码仅用于演示目的。

于 2010-07-22T15:10:03.763 回答