我想要做的是基本上这张照片显示的内容。 alt text http://a.imageshack.us/img20/9206/foldersrb.jpg
当我从树视图中选择某些内容时,它会将参数传递给linq命令,该命令从数据库中选择一些数据。对于选择中的每个项目,我想制作一个Icon和一个文本,表示该项目是文件夹还是文件。 当我按下Icon或Link时,我希望它与我推送树视图一样,将参数传递给linq命令,该命令再次从数据库中选择并填充占位符。
我现在这样做的方法是在runtima上制作一个包含ImageButton和LinkButton的Panel。然后我将Panel添加到ContentPlaceHolder。 这个问题是每当我选择新的东西时它都会这样做,如果按下图标或链接按钮,我只能从树视图中获取它。
我可以使用一些控制器和CSS来获取图标吗? 还有另一种更好的方法吗?
这与Explorer在Windows中使用的系统基本相同,Treeview仅显示文件夹,但窗口显示文件夹和文件。当我单击文件夹打开的文件夹时,主窗口中填充了该文件夹内的项目。如果我单击一个文件,编辑器会打开文件内容。
答案 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
}
如果有什么不清楚,请告诉我。这只是一个快速的徒手样本,因此请原谅任何错别字或不良行为......代码仅用于演示目的。