2011-09-27 37 views
4

编辑:
显然,问题的一部分是,当一个ASP:GridView控件有OnDataBound()事件(您可以在代码隐藏使用),对应的生成的HTML表格不是,因此您可以将该事件附加到JavaScript。 (我有没有这样做?)所以,这就是为什么我在这个问题上遇到麻烦。回到绘图板。更新ASP.NET页之后的GridView的DataBind


我是一个桌面开发人员(WinForms与VB.NET)过渡到ASP.NET开发。我的想法是真正围绕着DOM和JavaScript以及Session State和所有与Web开发相关的东西。我并不愚蠢,而且我已经完成了研究(包括几个小时的视频观看和数百页的“ASP.NET入门”阅读),但我一直在用看似相当直接的问题撞墙。

基本上,我目前的状况可以概括如下:

  1. 我有一个运行由用户发起一个很长的过程的页面。
  2. 长期的过程可能需要长达几分钟的时间,所以我想以指示某些事情正在发生的用户。
  3. 当过程结束后,我要么有:
    一个。结果显示在GridView
    b。没有结果显示
  4. 如果我有结果显示,我想显示它们。
  5. 如果我没有结果显示,我想向用户显示一个标签,上面写着“没有显示结果”。

什么工作:

  1. 我有,用户可以选择开始和结束日期,并揭开序幕检查过程中一个基本的网页。
  2. 检查过程正常(使用为此程序的桌面版开发的LINQ-to-SQL逻辑)。
  3. 我有我的网页上一个UpdatePanel这说明一个标签和GIF格式的动画以表明有些事情在发生。
  4. 如果我得到结果,它们会在我的GridView中正确显示。

什么是不工作:

  1. 我很乐意给用户某种进度条来表示对帮助完成,而不是无休止的一些,动画GIF实际进展并不表明多在所有。我可以快速轻松地计算出这个值,但无法弄清楚如何将所述值从服务器传输到网页。

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

问题#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> 

我在想什么?

谢谢!

回答

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

还是我失去了一些东西?

+0

这就是我的想法!问题是,正如我上面所述,设置lblNoMissing.Visible不会在长时间过程结束时调用它时做任何事情。我说SEEM是因为我对ASP.NET还是很陌生,所以我可能会错过一些东西。在UpdatePanel中由Button生成长进程是否重要? – mbm29414

+0

我不这么认为。我可能是错的(我对这一切还是比较陌生的),但除非if(!IsPostBack)在if语句的前后出现,否则它仍应呈现。 – Gobbledigook

+0

此外,当你呈现你的页面,你得到JavaScript错误?在你的if(gridView.rows.length> 0)中,如果你没有任何行,是不是会引用一个空对象并且出错? – Gobbledigook

1

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

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

+0

对不起,如果我没有说清楚,但我不知道如何获得databound()工作。当我将它放在我的aspx文件中时,出现错误“databound not Default.aspx的成员”。虽然我试图模仿我见过的其他示例,但似乎无法弄清楚如何将“databound()”作为JavaScript函数添加到我的页面。思考? – mbm29414

0

所以,我不确定我是否按照我想要的方式解决了这个问题,但是我有一个工作版本。这是我做了(别人谁可能会发现这很有用):

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

  2. 我有一个GridView,一个进度标签,一个动画GIF和一个“无结果”标签,我想在各种时间显示/隐藏。最终为我工作的是将它们全部放在UpdatePanels中,并简单地将它们隐藏在我的代码隐藏中。它有点合理,但是当控件更改为UpdatePanel的外部时,从代码隐藏中更改控件的可见性,但代码是从INSERT的UpdatePanel启动的,似乎是无法跨越的障碍。也就是说,当我的“没有失踪”标签在UpdatePanel的外部时,长时间运行的进程(由UpdatePanel中的按钮启动)无法改变其可见性。 (这有道理吗?任何人都想纠正?)

感谢您的阅读!感谢您的想法!


编辑:
OK,所以我又错了明显。显示/隐藏我的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期间展示,我只是试图让项目,如果我让他们,将它们隐藏。现在我的页面正常运行。这可能是一些黑客代码,但页面至少看起来是我想要的!