在GridView DataBind之后更新ASP.NET页面

时间:2011-09-27 18:08:38

标签: javascript asp.net vb.net

修改:
显然,问题的一部分是,虽然ASP:GridView有一个OnDataBound()事件(您可以在代码隐藏中使用),但生成的相应HTML表格不会,因此您可以将该事件附加到JavaScript。 (我说得对吗?)所以,这就是我遇到问题的原因。回到绘图板。


我是桌面开发人员(使用VB.NET的WinForms)转换到ASP.NET开发。我的想法是围绕DOM,JavaScript和会话状态以及与Web开发相关的所有内容。我并不傻,而且我已经完成了研究(包括几个小时的视频观看和数百页的“ASP.NET简介”阅读),但我一直在用一些看似相当简单的问题来打击墙。

基本上,我目前的情况可归纳如下:

  1. 我有一个页面运行由用户启动的非常长的过程。
  2. 漫长的过程可能需要几分钟,所以我想向用户表明正在发生的事情。
  3. 当过程完成后,我要么: 一个。结果显示在GridView中 湾没有结果显示
  4. 如果我要显示结果,我想显示它们。
  5. 如果我没有显示结果,我想向用户显示一个标签,上面写着“没有结果显示。”
  6. 什么在起作用:

    1. 我有一个基本页面,用户可以选择开始日期和结束日期,然后启动检查过程。
    2. 检查过程正常(使用为该程序的桌面版本开发的LINQ-to-SQL逻辑)。
    3. 我的页面上有一个UpdatePanel,显示一个标签和一个GIF动画,表明正在发生的事情。
    4. 如果我得到结果,它们会在我的GridView中正确显示。
    5. 什么不起作用:

      1. 我很乐意为用户提供某种进度条,以指示在完成时取得的实际进展,而不是一些无穷无尽的动画gif,这些内容根本没有说明。我可以快速,轻松地计算出这个值,但无法弄清楚如何将所述值从服务器传输到网页。

      2. 我无法弄清楚如何触发标签的“取消隐藏”事件。长时间运行的进程位于按钮的单击事件处理程序中,我在其中运行自定义代码并生成DataTable,然后将其保存为会话变量,将其指定为GridView的DataSource并调用GridView.DataBind()。当我尝试确定DataTable的内容并隐藏/显示那里的标签时,似乎没有任何事情发生。

      3. 问题#2真的是我需要弄清楚才能发布这个网站。我假设它涉及JavaScript解决方案,我尝试了一些东西,但我发现我真的在猜测并且没有很好地掌握解决方案应该类似的东西。

        这是我想要有选择地揭示/显示的标签:

        <tr>
            <td colspan="2" align="center">
                <h2><asp:Label runat="server" ID="lblNoMissing" Text="No Missing Documentation Found" Visible="false"></asp:Label></h2>
            </td>
        </tr>
        

        这是我正在尝试测试的JavaScript函数:

        <script type="text/javascript">
            function databound() {
                var gridViewID = '<%=_gridView1.ClientID%>';
                var labelID = '<%=lblNoMissing.ClientID%>';
                var gridView = document.getElementById(gridViewID);
                if (gridView.rows.length > 0) {
                    $get(labelID).style.visibility = "false";
                } else {
                    $get(labelID).style.visibility = "true";
                }
            }
        </script>
        

        问题:此操作失败(数据绑定不是Default.aspx的成员):

        <asp:GridView ID="_gridView1" runat="server"
            AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" 
            ForeColor="#333333" GridLines="Horizontal" PageSize="20" OnDataBound="databound();">
        // Rest of GridView definition removed
        </asp:GridView>
        

        我错过了什么?

        感谢!!!!

3 个答案:

答案 0 :(得分:1)

对于#2,设置style.visibility =“visible” 请参阅:http://www.w3schools.com/cssref/pr_class_visibility.asp 有效值。

对于#1,您可以使用带有计时器的更新面板来刷新它。服务器可以简单地将当前状态添加到该用户会话。更新面板代码读取会话并显示结果。

答案 1 :(得分:1)

对于问题#1,有一大堆免费的Javascript进度条。至于你无法检索的价值,试试这个:

<asp:Label ID="ProgressValue" runat="server" visible="false" /> 

在你的代码背后。

ProgressValue.Text = //Your value from your database. 

只需从你的Javascript中引用它。

对于你的第二个问题,你不能只在后面的代码中做(用C#编写)

//Process here
if(IDofGridView.Rows != null) 
{
    lblNoMissing.Visible = true; 
}

或者我错过了什么?

答案 2 :(得分:0)

所以,我不确定我是否按照我想要的方式解决了这个问题,但我有一个正常工作的版本。这就是我所做的(对于其他可能认为有用的人):

  1. 我现在已经放弃了#1的计划。我只是暂时没有时间继续研究这个问题。不过,我很沮丧,因为这似乎是很多人需要做的事情,但我找不到一个千篇一律的解决方案。对我来说似乎很奇怪。也许我仍然缺少一些可以让它变得简单的关键信息。

  2. 我有一个GridView,一个进度标签,一个动画gif和一个我想在不同时间显示/隐藏的“无结果”标签。最终为我工作的是将它们全部放在UpdatePanels中,只是在我的代码隐藏中显示/隐藏它们。这有点开始有意义,但是当控件更改为UpdatePanel的OUTSIDE但是代码从Update INSnel启动时更改控件的可见性从而代码隐藏起来似乎是一个无法跨越的障碍。也就是说,当我的“不丢失”标签位于UpdatePanel的外部时,长时间运行的进程(由UpdatePanel内部的按钮启动)无法更改其可见性。 (这有意义吗?有人想纠正吗?)

  3. 感谢阅读!谢谢你的想法!

    <小时/> 修改:
    好的,所以我显然错了。显示/隐藏我的Label和GridView的代码与代码隐藏文件中长时间运行的进程中执行的任何代码无关。

    这是实际执行我想要的代码(代码在Default.aspx中):

    <script type="text/javascript" >
    Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(CheckStatus);
    
    function CheckStatus(sender, args) {
        var prm = Sys.WebForms.PageRequestManager.getInstance();
    
        if (prm.get_isInAsyncPostBack()) {
            args.set_cancel(true); // stop request from being sent
            $get("_messageSpan").innerHTML = "<h2>The last request is still processing.</h2>";
        }
        else {
            var lbl = document.getElementById('<%=lblNoMissing.ClientID%>');
            if (lbl) {
                lbl.style.visibility = "hidden";
            }
            var gview = document.getElementById('<%=_gridView1.ClientID%>');
            if (gview) {
                gview.style.visibility = "hidden";
            }
            $get("_messageSpan").innerHTML = "";
        }
    }
    </script>
    

    与“_messageSpan”相关的代码是为了防止后续按钮点击再次启动长时间运行的进程(并且还通知用户它仍在运行)。

    所以,因为在非AsyncPostBack期间我的任何一个项目永远都是正确的,所以我只是尝试获取这些项目,如果我得到它们,则将它们设置为隐藏。现在我的页面表现正常。这可能是一些hacky代码,但页面至少看起来像我想要的方式!