【问题标题】:Unable to access child control in gridview from javascript无法从javascript访问gridview中的子控件
【发布时间】:2016-12-04 13:04:04
【问题描述】:

所以我来了。我尽力自己做,我是 asp.net 网络表单的新手,我在互联网上打了一个多星期,阅读了数百篇帖子,但我完全没能解决我的问题。 我正在使用网格视图我有我想用 jQuery UI 对话框按钮验证的链接按钮。首先,我尝试从后面的代码中附加事件处理程序,即 btnDelete_click(object sender, EventArgs e) 在 jQuery 对话框的 Delete 按钮单击时调用,从 @987654321 实现@我完全失败了,我看到,如果它是一个独立的按钮,而不是在像 grid-view 等父容器中,它就像上面的链接中所做的那样工作,但如果它在网格中,它会一直说提供的 Id 不存在在当前情况下。我尽我所能:

1) 使按钮 ClientIDMode = Static 并尝试使用 document.getElementById('').click(); 其中 btnDelete 是 链接按钮 的 ID。我得到的错误 btnDelete 在当前上下文中不存在

2) 移除静态选项并使用 document.getElementById('").click() ;。我得到的错误是对象引用未设置为对象的实例。

3) 有无静态 ID 模式我尝试了所有方法,也使用了 UniqueID 甚至我从 DOM Inspect Element 复制了 ID -单击并检查链接按钮,但一切正常。

然后我尝试了不同的方法,我厌倦了使用 Client.RegisterStartupScript 从后面的代码运行 JavaScript。我使用了 StartupScript,以便脚本在关闭正文和表单标记之前在文档末尾运行,以便所有元素在被引用之前创建。使用这种方法,我能够显示 jQuery 弹出窗口,但仍然是老问题,我必须从 JavaScript 调用 btndelete_click(object sender EventArgs e) 之类的代码事件处理程序,但它没有发生。

这是我的代码:

网络表单

<asp:GridView ID="gvDoctors" runat="server" AutoGenerateColumns="false" OnRowDataBound="gvDoctors_RowDataBound">
  <columns>
           <asp:TemplateField>
            <ItemTemplate>
              <asp:HiddenField ID="hdnUserID" runat="server" value='<%#DataBinder.Eval(Container.DataItem, "UserID")%>' />
            </ItemTemplate>
           </asp:TemplateField>
           <asp:TemplateField HeaderText="Delete">
             <ItemTemplate>
               <asp:LinkButton runat="server" ID="btnDelete" ClientIDMode="Static" CssClass="test" OnClientClick="return stopASPOnClick()" OnClick="btnDelete_Click">Delete
               </asp:LinkButton>
              </ItemTemplate>
             </asp:TemplateField> 

 </columns>
</asp:GridView> 
<script type="text/javascript">
$(document).ready(function () { 
    var bootstrapButton = $.fn.button.noConflict();
    $.fn.bootstrapBtn = bootstrapButton;
});
function openDialog() {
    $('#dialog-delete').dialog({
        resizable: false,
        height: 150,
        width: 375,
        autoOpen: false,
        modal: true,
        buttons: {
            Delete: $("#dialog-delete").on('click', function (e) {
               document.getElementsById('<%= gvDoctors.FindControl("btnDelete").ClientID%>').click();
                $(this).dialog("close");
            }),
            Cancel: $("#dialog-delete").on('click', function () {
                $(this).dialog("close");
            })
        }
    });

   $('.test').click(function (e) {
        $('#dialog-delete').dialog('open');
    })
}


function stopASPOnClick() {
    return false;
}
</script>

所以被问到的 问题 是如何获得嵌套在父控件中的子控件的 ID,例如网格中的链接按钮,以便我可以从后面的代码中调用其事件处理程序,或者无法将与服务器控件中相同的子控件 ID 检索到 JavaScript(客户端)并调用它们的事件处理程序,如上面所附链接中所示。提前致谢。

注意:-我也尝试过 document.Ready 中的对话框脚本,但没有在函数中指定它们

【问题讨论】:

标签: javascript c# jquery asp.net webforms


【解决方案1】:

如果我正确理解了您的问题,您希望在 GridView 中的 LinkBut​​tons 中添加一个 jQuery 对话框。

<asp:LinkButton OnClientClick='<%# "return openDialog(this, &#39;Do you want to delete " + Eval("UserID") + "?&#39;)" %>' ID="deleteItem" runat="server">Delete</asp:LinkButton>

还有 JavaScript

<script type="text/javascript">
    var confirmed = false;

    function openDialog(obj, msg) {
        var btn1 = "Confirm";
        var btn2 = "Cancel";
        $('<div />').html(msg).dialog({
            resizable: false,
            draggable: false,
            modal: true,
            position: {
                my: 'center',
                at: 'top+250',
                of: window
            },
            buttons: [
            {
                text: btn1,
                icons: {
                    primary: "ui-icon-check"
                },
                click: function () {
                    $(this).dialog("destroy");
                    confirmed = true;
                    obj.click();
                }
            }, {
                text: btn2,
                icons: {
                    primary: "ui-icon-closethick"
                },
                click: function () {
                    $(this).dialog('close');
                }
            } ]
        });

        return confirmed;
    }
</script>

【讨论】:

  • 第一个 thnx 4 正在研究它,它的工作范围是在网格视图中单击删除按钮时打开对话框。如果单击确认,它会执行回发到页面加载方法。您确实了解我的意图,但老实说,这不是我问题的答案(即使它对我有用)。我请你帮个忙,请指导我一些关于语法的事情。我的意思是为什么 ' 有效而撇号无效,以及为什么我在 处出现红色下划线?'NewLine in constant,那么 '?' 在关闭 ' 时怎么样。再次感谢您的时间和精力。
  • &amp;#39HTML character reference。 HTML 将其视为撇号。它是必需的,因为在 GridView 中,您需要用于 aspnet 数据绑定的撇号 OnClientClick='&lt;%#,因此您不能将其用于 javascript。如果您查看 aspx 页面的 HTML,您会发现经常使用 &amp;#39。 VS给出了那个错误,我不知道为什么。也许是一个错误。这就是为什么我通常使用来自代码后面的方法 (getJavaScriptString(Eval("UserID").ToString())) 来填充 javascript 内容
  • 问号只是为了造句语法正确。要获取 GridView 中对象的 ID,请查看我的回答 here
  • 好的,我将实现您获取嵌套控件 ID 的方法,我将查看是否能够使用该 ID 从后面的代码调用事件处理函数。你还说,“我通常填充那个javascript内容,你的意思是+ Eval("UserID") +这部分由那个javascript内容。你的意思是你写了一个自定义方法getJavaScriptString(string);就像后面的代码和然后你从 OnClientClick 的函数调用中传递参数?如果我错了,请纠正我,而不是 + Eval("UserID") +
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多