0

我有以下 gridview 和“loadingbar” div:

<asp:GridView ID="importLogGV" 
    AutoGenerateColumns="false" 
    DataKeyNames="id" 
    OnRowDeleting="DeleteStuff" 
    runat="server" 
    CssClass="searchListGridView">
<Columns>
<asp:BoundField HeaderText="ID" DataField="id">
    [...]
<asp:TemplateField ItemStyle-Width="120">
    <ItemTemplate>
        <asp:LinkButton ID="lnkDel" CommandName="Delete" Text='Delete' runat="server" 
         OnClientClick="return confirm('Really delete?');" />
    </ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

<div id="deleting" style="text-align: center" Visible="False" runat="server" 
 ClientIDMode="Static">Delete in progress...<br />
<asp:Image runat="server" ID="Image1" ImageUrl="~/Images/ajax-loadingbar.gif"/>
</div>

虽然事件处理程序“DeleteStuff”在后面的代码中运行(它执行大量数据库操作,最多可能需要 10 秒),但我需要显示“删除”div,当事件处理程序完成时,它需要再次隐藏 div。

这是我在代码隐藏中删除的事件处理程序:

protected void DeleteStuff(object sender, GridViewDeleteEventArgs e)
{
    deleting.Visible = true;

    System.Threading.Thread.Sleep(5000);

    deleting.Visible = false;
}

我尝试使用 style:display 代替 visible 属性,我尝试使用 asp:panel 代替 div,但无论我做什么,事件处理程序都会运行,但 div 在运行时从未显示。

当用户单击删除按钮时,我想用 javascript 显示 div,但是在 DeleteStuff 过程完成后,我怎么能再次隐藏它呢?

4

2 回答 2

2

每当您单击要删除的按钮时,都会向服务器发送提交请求,并且您的页面开始刷新。服务器上的方法执行完成后,页面将重新渲染。因此,无论您在方法中做什么,最后的效果都会保留。如果你想在浏览器上显示繁忙的文本,ajax 是一种方式;您将不得不使用更新面板。尝试这个:

的JavaScript:

<script type="text/javascript">
    function showDeleteConfirm()
    {
        var isSure = confirm('Really delete?');
        if(isSure)
        {
            document.getElementById("deleting").style['display'] = 'block';
        }
    }
</script>

aspx 标记:

<asp:UpdatePanel id="up1" runat="server">
    <ContentTemplate>
    <asp:GridView ID="importLogGV" 
        AutoGenerateColumns="false" 
        DataKeyNames="id" 
        OnRowDeleting="DeleteStuff" 
        runat="server" 
        CssClass="searchListGridView">
    <Columns>
    <asp:BoundField HeaderText="ID" DataField="id">
        [...]
    <asp:TemplateField ItemStyle-Width="120">
        <ItemTemplate>
            <asp:LinkButton ID="lnkDel" CommandName="Delete" Text='Delete' runat="server" 
             OnClientClick="return showDeleteConfirm();" />
        </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>

    <div id="deleting" style="text-align: center" style="display:none" runat="server" 
     ClientIDMode="Static">Delete in progress...<br />
    <asp:Image runat="server" ID="Image1" ImageUrl="~/Images/ajax-loadingbar.gif"/>
    </div>
    </ContentTemplate>
</asp:UpdatePanel>

后面的代码:

protected void DeleteStuff(object sender, GridViewDeleteEventArgs e)
{
    //... Real task here
    System.Threading.Thread.Sleep(5000);
    deleteing.Style['display'] = 'none';
}

顺便说一句,您需要ScriptManager在页面上添加一个。

于 2013-06-19T09:39:42.707 回答
0

你有没有尝试过:

protected void DeleteStuff(object sender, GridViewDeleteEventArgs e)
{
    if (CheckAccess())
    {
        deleting.Visible = true;
        System.Threading.Thread.Sleep(5000);   
        deleting.Visible = false;
    }
    else
    {
        Dispatcher.BeginInvoke((Action) (() => DeleteStuff(sender, e)));
    }
}

顺便说一句,您可能应该使用 Timer 而不是 Thread.Sleep(5000)。

于 2013-06-19T09:26:38.683 回答