2010-11-11 111 views
1

一般信息:確認刪除彈出記錄計數

Aspx頁面包含一個Ascx用戶控件。在用戶控件中,Repeater包含在View中,包含在Multiview中。 Asp.Net 2.0框架/ C#

詳細說明:

我有一個轉發器(一個ASCX用戶控件中),它顯示的記錄,和第一列是一個複選框。如果選中,該行將被刪除。 在轉發器的外面,我有一個按鈕將刪除所有被檢查的行。

一切工作正常,但已被要求添加彈出式「確認刪除」消息,其中包括如果用戶在彈出窗口上單擊「確定」時將被刪除的記錄數。

類似於: 「您即將刪除8條記錄」。

目前我的按鈕看起來是這樣的:

<asp:Button ID="btnDeleteAllRecords" runat="server" Text="Delete all Checked Records" Onclick="btnDeleteAllRecords_Click" OnClientClick="javascript:GetCbCount();" /> 

我有這樣的javascript代碼塊:

<script type="text/javascript"> 
function GetCbCount() 
{ 
var cb = document.getElementById("rptrVoicemail").getElementsByTageName("input"); 
    var cbCount; 
for(i = 0; i < cb.lenght; i++) 
{ 
    if(cb[i].type == "checkbox") 
    { 
     if(cb[i].checked) 
     { 
      cbCount = cbCount + 1; 
     }    
    }  
} 
return confirm('You are about to delete' + cbCount + 'records.'); 

} 
</script> 

當我點擊我的按鈕,我得到:

錯誤:「文件.getElementById(...)'爲空或不是對象 on this line:

var cb = document.getElementById("rptrVoicemail").getElementsByTageName("input"); 

爲什麼JS沒有看到我的轉發器?是因爲它埋在了MultiView中嗎?如何糾正JS,以便彈出窗口顯示消息中的記錄數量?

UPDATE: 我改變了腳本:

function GetCbCount(){ 
    var inpt = document.getElementById("vmDiv"); 
    var checkboxes = inpt.getElementsByTagName("input"); 
    var cbCount; 
    for(i = 0; i<checkboxes.lenght;i++){ 
     if (checkboxes[i].type == "checkbox" && checkboxes[i].checked){ 
     cbCount = cbCount + 1; 
     } 
    } 
    return confirm('You are about to delete ' + cbCount + ' Voicemails.'); 
} 
+0

在函數中,行以'var cb = ...開頭'並在'var inpt = ...'的錯誤描述中。這是一個疏忽嗎? – 2010-11-11 20:54:44

+0

嗨蒂姆,謝謝你指出。這是一個疏忽。我糾正了我的帖子。 – Doug 2010-11-11 21:07:20

+0

你的按鈕旁邊的中繼器?如果是這樣,你可以使用DOM-Model來獲取他。另一個問題:您的Javascript位於頁面內部還是包含在內? – 2010-11-11 21:29:22

回答

0

這應該工作:

document.getElementById('<%= rptrVoicemail.ClientID %>').getElementsByTageName("input"); 

另一種方法是這個小腳本返回客戶端ID。你甚至可以將它添加到一個包含的JS文件中。

function GetClientId(strid) 
{ 
    var count=document.forms[ 0 ].length ; 
    var i = 0 ; 
    var eleName; 
    for (i = 0 ; i < count ; i++) 
    { 
     eleName = document.forms [ 0 ].elements[ i ].id; 
     pos=eleName.indexOf(strid) ; 
     if(pos >= 0) break;   
    } 
    return eleName; 
} 

找到here

+0

嗨蒂姆,拍攝,仍然出現錯誤: – Doug 2010-11-11 21:08:17

+0

請嘗試上面的腳本。 – 2010-11-11 21:42:16

+0

將嘗試您的腳本,謝謝。 – Doug 2010-11-11 21:55:46

0

如果您正在使用母版頁或嵌套控件(在ascx,view等內部),框架將更改使用元素呈現的ID。

如果您執行「查看源代碼」或使用FireBug,您可能會看到rptrVoicemail變成類似ctl00_ContentPlaceHolder1_someUserControl_ctl00_multiViewID_ctl28_rptrVoicemail的東西。

您可以使用getElementById('<%= rptrVoicemail.ClientID %>')來獲取元素的ID,因爲它會在客戶端上呈現。

編輯:爲了幫助調試,做這樣的事情......你明白了。 var rptr = document.getElementById('<%= rptrVoicemail.ClientID %>'); rptr.borderColor = 'pink'; // draw a border to check it's the right element

+0

謝謝。只做了一個ViewSource。中繼器呈現爲一個普通的html表格。該表的id爲'tblRecords',在Viewsource中呈現。是的,我正在使用母版頁。所以樹會成爲aspx頁面(帶有MasterPage),ascx用戶控件,MultiView,View,Repeater。 – Doug 2010-11-11 21:15:33

+0

中繼器通常不會呈現任何東西 - 它只是for-loop的聲明式替換,它將會吐出HeaderTemplate,ItemTemplate,FooterTemplate中定義的任何內容。 – Leon 2010-11-11 21:30:43

+0

沒錯。由於我在Repeater ItemTemplate中定義了一個html表格,因此它正在吐表一個表格。 – Doug 2010-11-11 21:54:00