2014-03-06 85 views
2

這是我的情景:ASP:按鈕不顯示正確

我想顯示根據我在GridView中顯示的行量的按鈕(btnGenerate)。我已經得到它顯示一秒鐘,然後再次消失。我正在使用其他按鈕之一的onclientclick(btnImport)。我認爲導致這個問題的是,在同一個按鈕(btnImport)的OnClick事件中,兩個gridview對每個數據綁定執行。這可能是問題嗎?我已經使用JavaScript編寫腳本來從客戶端執行此任務。有沒有更好的方法來做到這一點?我能做些什麼來解決我的問題?

這裏是我的代碼,我到目前爲止有:

<asp:Button runat="server" ID="btnImport" Text="Load Data from File" 
    BackColor="#990000" ForeColor="White" nowrap OnClick="btnImport_Click" 
    style="display:none" OnClientClick="DisplayButtonGenerate()"/> 

<asp:Button ID="btnGenerate" runat="server" Text="Generate New Stock Codes" 
    BackColor="#990000" ForeColor="White" OnClick="btnGenerate_Click" 
    style="display:none" /> 

我有兩個GridView的:ErrorsGrid顯示所有故障記錄和InventoryGrid顯示是正確的記錄。就像我上面說的,如果ErrorsGrid的rowCount = 0,想法是顯示btnGenerate。

protected void btnImport_Click(object sender, EventArgs e) 
{ 
    InventoryGrid.DataBind(); 
    ErrorsGrid.DataBind();   
} 

protected void btnGenerate_Click(object sender, EventArgs e) 
{ 
    FinalMessage.AppendLine(_InsertWrapper.PostData()); 
} 

下面是腳本:

<script language="javascript" type="text/javascript"> 
    function DisplayButtonGenerate() { 
     var rowCount = <%=ErrorsGrid.Rows.Count %>; 
     var buttonGen = document.getElementById("<%=btnGenerate.ClientID%>"); 
     if(rowCount == 0) 
     { 
      buttonGen.style.display = "block"; 
     } 
    } 
</script> 
+0

顯示'btnGenerate'按鈕後,你想要做什麼?你想跳過這個帖子嗎? –

回答

1

您的btnImport有服務器端OnClient和客戶端OnClientClick都設置。我猜想發生了什麼事情是客戶端首先被調用,顯示按鈕,然後服務器端進入,頁面從服務器刷新,並且你的按鈕被再次隱藏。你可以做到這一點在這種或那種方式,但不能同時:

服務器端:刪除OnClientClick & style="display:none" & JavaScript中,按鈕的Visible屬性設置爲false,並在代碼隱藏單擊事件服務器地址:

if(ErrorsGrid.Rows.Count == 0) 
    btnImport.Visible = True; 

客戶端:返回false從JavaScript函數的OnClientClick

OnClientClick="return DisplayButtonGenerate()" 

function DisplayButtonGenerate() { 
    .... 
    return false; 
} 
+0

感謝您的幫助!它增加了一些知識給我對asp的理解,我選擇使用第一種選擇。這非常簡單,效果很好 –

+0

非常歡迎。我們都在這個世界學習。很高興幫助。 –

0

沒有必要在這裏一個JS的功能。

簡單地檢查數據源的ErrorsGrid if count != 0,如果它不只是設置你的代碼隱藏在按鈕的可見性。

+0

這將是理想的,但我試過,並發表聲明 btnGenerate.Enable = true/false;沒有正確執行。它需要回發才能看到更改 –

+0

並且您無法做回發? – user1021726

+0

是的,我不能這麼做的主要原因是所有的數據處理等都是在InventoryUpload包裝器中完成的,所以我需要訪問的列表在btnImport_Click方法中是不可訪問的 –

1

如果你想更新代碼InventoryGrid,ErrorsGrid網格控件,你點擊一個按鈕後,你需要你的問題讓那些在UpdatePanel

<asp:UpdatePanel ID="upnl" runat="server" UpdateMode="Conditional"> 
<contenttemplate> 
InventoryGrid,ErrorsGrid mark up 
</contentTemplate> 
<Triggers> 
//set async trigger as btnImport 
</Triggers> 
</asp:UpdatePanel> 
+0

爲什麼返回false; –

+0

好吧,我已經做到了,它正確顯示按鈕,但然後我的Gridviews不顯示他們的數據 –

+0

@ user3180965,如果你不返回false,它將執行'btnImport_Click'事件,這是一個回發。當你做一個完整的回發,你不能看到可見的按鈕 –

1

讓我們分解成步驟。

  • 你點擊btnImport,它首先調用OnClientClick,做客戶端處理 ,然後做一個完整的回發,進入到服務器端並處理其服務器端的處理程序OnClick

  • 在處理完OnClick處理程序後,頁面再次呈現,btnGenerate display:none中的未經處理的代碼再次運行,並且再次呈現默認狀態。

你看到問題了嗎?即使您在處理clientClick中的某些邏輯,它也會在頁面重新加載時重置,因爲您的btnImport正在這樣做。

解決方案:

有幾件事情我可以建議。

  1. 使用的UpdatePanel,以防止回發整個頁面或
  2. 讓你btnImport一個客戶端按鈕完全,並使用XHR或jQuery的AJAX做一個職位。
  3. 設置在服務器端本身btnGenerate的知名度

最簡單的將是第三一個,即從代碼中刪除的OnClientClick事件,改變你的btnImport做到這一點:

protected void btnImport_Click(object sender, EventArgs e) 
{ 
    InventoryGrid.DataBind(); 
    ErrorsGrid.DataBind();   
    //set visibility of btnGenerate in Page_Load also; 
    btnGenerate.Visible = ErrorsGrid.Rows.Count == 0; 
} 

和刪除顯示:none from btnGenerate from client

+0

ErrorsGrid.Rows.Any();給出了一個編譯器錯誤,說GridViewCollection不包含任何定義,如果我刪除腳本,並做了你上面提到的 –

+0

你需要在你的頁面中使用System.Linq abv,反正我修改了我的代碼,現在checkitout –

+0

好吧我改變了那部分和邏輯有點不對,但我糾正它,它現在的作品 if(ErrorsGrid.Rows.Count == 0) btnGenerate.Visible = true; –

0

如果我理解你請求。正確的,設置'Visbible'屬性的按鈕爲真或假應該工作。即btnGenerate.Visible = true/false。最初,您可以將按鈕可見性設置爲false,然後根據記錄計數,您可以在必需的事件處理程序中對其進行修改。