Javascript 确认删除带有记录计数的弹出窗口

Javascript 确认删除带有记录计数的弹出窗口,javascript,asp.net,repeater,Javascript,Asp.net,Repeater,一般信息: Aspx页面包含一个Ascx用户控件。在用户控件中,中继器包含在视图中,包含在多视图中。 Asp.NET2.0Framework/C# 详情: 我有一个显示记录的中继器(在ascx用户控件中),第一列是一个复选框。如果选中,该行将被删除。 在中继器外,我有一个按钮,可以删除所有选中的行 一切正常,但已被要求添加一条弹出的“确认删除”消息,其中包括如果用户单击弹出窗口上的“确定”将被删除的记录数 比如: “您将要删除8条记录” 当前我的按钮如下所示: <asp:Butto

一般信息:

Aspx页面包含一个Ascx用户控件。在用户控件中,中继器包含在视图中,包含在多视图中。 Asp.NET2.0Framework/C#

详情:

我有一个显示记录的中继器(在ascx用户控件中),第一列是一个复选框。如果选中,该行将被删除。 在中继器外,我有一个按钮,可以删除所有选中的行

一切正常,但已被要求添加一条弹出的“确认删除”消息,其中包括如果用户单击弹出窗口上的“确定”将被删除的记录数

比如: “您将要删除8条记录”

当前我的按钮如下所示:

    <asp:Button ID="btnDeleteAllRecords" runat="server" Text="Delete all Checked Records" Onclick="btnDeleteAllRecords_Click" OnClientClick="javascript:GetCbCount();" />
为什么JS没有看到我的中继器?是因为它埋在多视图中吗?如何更正JS,以便弹出窗口在消息中显示记录计数

更新: 我将脚本更改为:

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.'); 
} 
函数GetCbCount(){
var inpt=document.getElementById(“vmDiv”);
var复选框=inpt.getElementsByTagName(“输入”);
var-cbCount;
对于(i=0;i而言,这应适用于:

document.getElementById('<%= rptrVoicemail.ClientID %>').getElementsByTageName("input");
document.getElementById(“”).getElementsByAgename(“输入”);
另一种方法是返回ClientID的小脚本,您甚至可以将它添加到包含的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;
 }
函数GetClientId(strid) { var count=document.forms[0]。长度; var i=0; 变量eleName; 对于(i=0;i=0)中断; } 返回eleName; }

找到。

如果使用母版页或嵌套控件(在ascx、视图等内部),框架将更改使用元素呈现的ID

如果您使用“查看源代码”或FireBug,您可能会看到,
rptrVoicemail
变得类似于
ctl00\u contentplaceholder 1\u someUserControl\u ctl00\u multiViewID\u ctl28\u rptrVoicemail

您可以使用
getElementById(“”)
获取元素的ID,因为它将在客户端上呈现

编辑:为了帮助调试,可以这样做……你明白了。

var rptr=document.getElementById(“”);
rptr.borderColor='pink';//绘制边框以检查它是否是正确的元素

在函数中,行以
var cb=…
开头,在错误描述中,行以
var inpt=…
开头。这是一个疏忽吗?嗨,蒂姆,谢谢你指出。这是一个疏忽。我更正了我的帖子。你的按钮在中继器旁边吗?如果是的话,你可以使用DOM模型找到他。另一个问题:你的Jav在哪里ascript位于页面内还是包含在页面内?谢谢。刚刚创建了一个ViewSource。Repeater正在呈现为一个普通html表。该表的id为ViewSource中呈现的“tblRecords”。是的,我正在使用母版页。因此该树将是aspx页(带有母版页),ascx用户控件,多视图,视图,Repeater.Repeater通常不会呈现任何内容-它只是一个for循环的声明性替换,该循环将吐出HeaderTemplate,ItemTemplate,FooteTemplate.Right中定义的任何内容。由于我在Repeater ItemTemplate中创建了一个html表,因此它将吐回一个表。请检查derTemplate包含
,footer包含
,ItemTemplate包含
..
中的行。否则,您将得到具有相同ID的所有HTML表。嗨,Leon,我已完全按照您的指示设置了我的表。其他表确实具有不同的ID。嗨,Tim,在尝试您的脚本之前,我对我的ori进行了一些更改区域脚本:函数GetCbCount(){var cb=document.getElementById(“vmDiv”);var复选框=inpt.getElementsByTagName(“input”);var cbCount;用于(i=0;iIt正在工作,但现在无论单击哪个按钮=确定或取消,都将删除记录。我的返回状态是否不正确?另一个更新:我将OnClientClick状态更改为:OnClientClick=“if(GetCbCount()==false)return false;”现在单击“取消”将停止删除记录。新问题:确认弹出窗口现在显示“您将要删除未定义的记录”。“未定义”应该是我的记录总数。我已使用您当前的脚本(从上面的注释)更新了您的问题。是的,只有当用户单击“确定”时,您才能返回GetCbCount()以删除。我将用以下方式定义cbCount:
var cbCount=0;
document.getElementById('<%= rptrVoicemail.ClientID %>').getElementsByTageName("input");
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;
 }