2011-09-27 108 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期間展示,我只是試圖讓項目,如果我讓他們,將它們隱藏。現在我的頁面正常運行。這可能是一些黑客代碼,但頁面至少看起來是我想要的!