请考虑这些操作 -
- 在DataList中绑定文件列表。
- 用户单击删除LinkBut ton后,在 ItemCommandEvent中删除文件。
- 由于重新绑定整个数据效率低下,我只是隐藏已删除的行。
以下代码显示 DataList 中的文件。每行旁边都有一个删除按钮。
<asp:DataList ID="DataList1" OnItemCommand="DataList1_ItemCommand" runat="server">
<ItemTemplate>
<tr>
<asp:Label Text='<%# Eval("ContainingFolder") as string + "\\" + Eval("FileName") as string %>'
Visible="false" ID="lblFullPath" runat="server" />
<td><%# Eval("FileName") %></td>
<td><%# Eval("ContainingFolder") %></td>
<td><%# Eval("FileSize") %></td>
<td><%# Eval("Modified") %></td>
<td>
<asp:LinkButton Text="Delete" ID="linkDelete" runat="server" />
</td>
</tr>
</ItemTemplate>
</asp:DataList>
在 ItemCommand 事件处理程序中,此代码从此列表中删除选定的文件。
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;
var selectedItem = e.Item.FindControl("lblFullPath") as Label;
e.Item.Visible = false; //doesn't work
File.Delete(selectedItem.Text);
}
但是e.Item.Visible = false不会隐藏该行。作为此处找到的解决方法,如何隐藏数据列表中的项目
我已将内容包装在占位符控件中。
<ItemTemplate>
<asp:PlaceHolder ID="ph1" runat="server">
<%--wrapped content--%>
</asp:PlaceHolder>
</ItemTemplate>
并隐藏占位符控件 -
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;
var selectedItem = e.Item.FindControl("lblFullPath") as Label;
//e.Item.Visible = false;
e.Item.FindControl("ph1").Visible = false;
File.Delete(selectedItem.Text);
}
通常在 asp.net 中隐藏父控件会隐藏其所有子控件。
但我无法理解,
为什么在 DataList 的情况下隐藏父控件 e.Item 不会隐藏其包含的元素?你能给些建议么。
感谢您的帮助。
编辑:更新有关生成要在 DataList 中显示的文件列表的更多信息。
- 在按钮单击时在运行时生成 fileList,此列表当前不是持久的。
protected void btnFindDuplicates_Click(object sender, EventArgs e) { DataList1.DataSource = FindDuplicates(); DataList1.DataBind(); }
- 在 delete Click 的事件处理程序中,删除操作已经成功完成。
- 所以,只是为了从页面中删除已删除的项目,重新生成数据源并绑定它是不明智的。隐藏对我来说似乎更合乎逻辑。