2

请考虑这些操作 -

  1. 在DataList中绑定文件列表。
  2. 用户单击删除LinkBut ​​ton后,在 ItemCommandEvent中删除文件。
  3. 由于重新绑定整个数据效率低下,我只是隐藏已删除的行。

以下代码显示 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 的事件处理程序中,删除操作已经成功完成。
  • 所以,只是为了从页面中删除已删除的项目,重新生成数据源并绑定它是不明智的。隐藏对我来说似乎更合乎逻辑。
4

1 回答 1

1

我使用 JQuery 和 PageMethods 创建了这个示例:

结果

在此处输入图像描述

ASPX

<script>
    $(function () {
        var $list = $("table[id*=myDataListID]");
        var $buttons = $("input:submit[id*=remove]", $list);

        $buttons.click(function (e) {
            e.preventDefault();

            if (!confirm("Are you sure?")) {
                return false;
            }

            var $self = $(this);
            var $jobID = $self.closest("tr").children().find("span[id*=jobID]");

            $buttons.prop("disabled", true);

            $.ajax({
                url: "<%: this.ResolveClientUrl("~/Topics/JQuery/Ajax/RemoveRowUsingJQueryAfterCallingService.aspx/Remove") %>",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: "{id: " + $jobID.text() + "}",
                async: true,
                cache: false,
                success: function () {
                    $buttons.prop("disabled", false);
                    $self.closest("tr").remove();
                },
                error: function (XHResponse, errorMessage, errorCode) {
                    $buttons.prop("disabled", false);
                    alert(errorMessage);
                }
            });
        });
    });
</script>

<asp:DataList runat="server" DataKeyField="job_id" DataSourceID="lds" ID="myDataListID">
    <HeaderTemplate>
        <tr>
            <th>
                &nbsp;
            </th>
            <th>
                ID
            </th>
            <th>
                Name
            </th>
        </tr>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <asp:Button Text="Remove" runat="server" ID="remove" />
            </td>
            <td>
                <asp:Label Text='<%# Eval("job_id") %>' runat="server" ID="jobID" />
            </td>
            <td>
                <asp:Label ID="jobDesc" Text='<%# Eval("job_desc") %>' runat="server" />
            </td>
        </tr>
    </ItemTemplate>
</asp:DataList>

背后的代码

[WebMethod]
public static void Remove(Int16 id)
{
    // simulate deleting the file
    Thread.Sleep(3000);
}

我刚刚将完整的工作示例上传到我的 GitHub 站点

于 2012-10-07T09:25:56.950 回答