c# - 从 DataList 中隐藏已删除的行而不重新绑定(bind) DataSource

标签 c# asp.net

请考虑这些操作-

  1. DataList 中绑定(bind)文件列表。
  2. 一旦用户点击删除 LinkBut​​ton,删除文件,在 ItemCommandEvent
  3. 由于重新绑定(bind)整个数据效率低下,我只是隐藏起来 删除行。

以下代码显示数据列表中的文件。每行旁边都有一个删除按钮。

<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 不会隐藏该行。 作为此处找到的解决方法,How to hide an item in datalist

我已将内容包装在占位符控件中。

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

Generally in asp.net hiding parent control hides all of its child controls.

但是我看不懂,

Why hiding the parent control e.Item doesn't hide its containing elements, in case of DataList ? Can you please advise.

感谢您的帮助。

编辑:更新有关生成要在 DataList 中显示的文件列表的更多信息。

  • 在运行时点击按钮生成文件列表,这个列表不是 坚持不懈,目前。
protected void btnFindDuplicates_Click(object sender, EventArgs e)
{
    DataList1.DataSource = FindDuplicates();
    DataList1.DataBind();
}
  • 在删除点击的事件处理程序中,删除操作已经完成 成功完成。
  • 所以,只是从页面中删除已删除的项目,这是不明智的 重新生成数据源并绑定(bind)它。隐藏对我来说似乎更合乎逻辑。

最佳答案

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

结果

enter image description here

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

I just uploaded the full working example to my GitHub site

关于c# - 从 DataList 中隐藏已删除的行而不重新绑定(bind) DataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12766916/

相关文章:

c# - 如何获取为当前执行的 httphandler 配置的路径?

c# - 集成测试和 TDD

c# - Asp.net 回发后如何保持label 的值?

c# - 异步调用的“加载”网页

asp.net - 有没有办法以编程方式检查 ASP.NET 应用程序的 CustomErrors 是否设置为 Off?

javascript - 如何在asp.net中的按钮单击OnClientClick上将文本框id传递给JavaScript

c# - 在 ASP.net 应用程序中配置 Azure KeyVault 时出现问题

c# - 多维数组与一维数组

c# - .NET 日期时间从字符串转换为日期时间时的毫秒精度问题

c# - 具有重定向输入/输出流的 HTML 中的 wkhtmltopdf 相对路径将不起作用