【问题标题】:How to find text-box in GridView using Javascript如何使用 Javascript 在 GridView 中查找文本框
【发布时间】:2014-02-09 16:17:12
【问题描述】:

我正在尝试使用 javascript 在 GridView 中访问和查找文本框,但出现错误:“当前上下文中不存在名称 txt_UID”。当我的文本框位于 GridView 之外时,一切正常。这是我在 gridview 中的文本框,我的 gridview 称为 GridView1:

 <asp:TemplateField ItemStyle-Width="150px" HeaderText="User Assigned">
    <ItemTemplate>  
     <asp:TextBox ID="txt_UID" runat="server" Text='<%# Eval("UID")%>'
        CssClass="AutoCompleteTextBox" Width="130px" BackColor="LightGoldenrodYellow"></asp:TextBox>
       </ItemTemplate>
         <ItemStyle Width="150px" />
         </asp:TemplateField>

这是我的 JavaScript:

  <script type ="text/javascript">
        function setAutoComplete() {
            var textBoxes = document.getElementsByClassName("AutoCompleteTextBox");
            for (var i = 0; i < textBoxes.length; i++) {
                addAutoComplete(textBoxes[i].id);
            }
        }
</script>

<script type="text/javascript">
    function addAutoComplete(textBoxId) {
        $("#" + textBoxId).autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: '<%=ResolveUrl("~/Service.asmx/GetUserNames") %>',
                    data: "{ 'prefix': '" + request.term + "'}",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                        response($.map(data.d, function (item) {
                            return {
                                label: item.split('-')[0],
                                val: item.split('-')[1]
                            }
                        }))
                    },
                    error: function (response) {
                        alert(response.responseText);
                    },
                    failure: function (response) {
                        alert(response.responseText);
                    }
                });
            },
            select: function (e, i) {
                $("#<%=hfUserId.ClientID %>").val(i.item.val);
            },
            minLength: 1
        });
    }; 

<script type ="text/javascript">
     $(document).ready(function () { setAutoComplete(); });
    </script>

【问题讨论】:

    标签: c# javascript asp.net gridview


    【解决方案1】:

    问题是您的GridView 在每一行创建一个TextBox。在GridView 之外没有“txt_UID”控件。这就是您的错误消息告诉您的内容。

    您的JavaScript 函数旨在与一个TextBox 一起使用。我想您希望 AutoComplete 可以处理 GridView 中的所有 TextBox 控件。

    我的建议是更改JavaScript 函数以获取具有TextBox ID 的参数,然后将CSS class 添加到每个TextBox,最后制作一个包装器JavaScript 函数,该函数将枚举TextBox 使用getElementsByClassName 控制,并在DOM ready 上调用该包装函数。

    这是它的样子:

    将 CSS 类添加到文本框:

    <asp:TemplateField ItemStyle-Width="150px" HeaderText="User Name">
        <ItemTemplate>  
            <asp:TextBox ID="txt_UID" runat="server" Text='<%# Eval("UID")%>'
                CssClass="AutoCompleteTextBox" Width="130px" BackColor="LightGoldenrodYellow"></asp:TextBox>
        </ItemTemplate>
        <ItemStyle Width="150px" />
    </asp:TemplateField>
    

    新的JavaScript函数:

    function setAutoComplete()
    {
        var textBoxes = document.getElementsByClassName("AutoCompleteTextBox");
        for (var i = 0; i < textBoxes.length; i++)
        {
            addAutoComplete(textBoxes[i].id);
        }
    }
    

    接下来,将你的另一个 JavaScript 变成一个带有参数(id)的函数:

    function addAutoComplete(textBoxId) {
        $("#" + textBoxId).autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: '<%=ResolveUrl("~/Service.asmx/GetUserNames") %>',
                    data: "{ 'prefix': '" + request.term + "'}",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                        response($.map(data.d, function (item) {
                            return {
                                label: item.split('-')[0],
                                val: item.split('-')[1]
                            }
                        }))
                    },
                    error: function (response) {
                        alert(response.responseText);
                    },
                    failure: function (response) {
                        alert(response.responseText);
                    }
                });
            },
            select: function (e, i) {
                $("#<%=hfUserId.ClientID %>").val(i.item.val);
            },
            minLength: 1
        });
    };
    

    最后,您的就绪代码更改为仅调用您创建的包装函数:

    $(document).ready(function () { setAutoComplete(); });
    

    奖励:这是一种仅使用 jQuery 的方法:

    (只需要 TextBoxes 上的 CSS 类)

    $(document).ready(function () {
        $.each($(".AutoCompleteTextBox"), function (i, textBox) {
            textBox.autocomplete( /* your code */);
        })
    });
    

    【讨论】:

    • 感谢大卫,我需要将 textBoxId 更改为 txt_UID 吗?因为那是我的文本框的 id,谢谢。
    • 否,因为我的代码的工作方式是 textBoxId 是 textBox 的真实 ID,包装函数 setAutoComplete 使用内置 JavaScript document.getElementsByClassName() 方法检索该 ID。基本上我的代码并不关心你的文本框的 ID - 它使用我添加的新 CSS 类来获取对 GridView 中所有文本框的引用(只要你不将该 CSS 类放在任何其他控件上或元素)。
    • 记住你没有一个文本框...你在gridview的每一行都有一个文本框。这是由 asp.net 为您生成的 HTML 元素,每个元素都有一个唯一的 ID。 “txt_UID”唯一有意义的地方是在 GridView 内部。有一些方法可以在 .net 中访问它(使用 FindControl 方法),但我认为我这样做的方式实际上更简单。
    • 没错,我现在正在进行更改并对其进行测试。很快就会通知你。谢谢
    • @moe:我的 jQuery 中还有一个错误 - 将 $(textBoxId) 更改为 $("#" + textBoxId),它现在可以工作了。
    【解决方案2】:

    您的Gridview 将呈现为Table,您的控件将包含在表的cell 中。您可以尝试关注。

    <script type=”text/javascript”>
    $(document).ready(function(){
    tblTable=document.getElementById(‘<<Client ID of the GridView>>’);
    Cell=tblTable.rows[i].cells[j];//i and j are locations of that cell.
    FirstControl = Cell.childNodes[0];
    });
    </script>
    

    &lt;&lt;Client ID of the GridView&gt;&gt; 替换为您的GridView 的ID

    【讨论】:

    • 谢谢,我不是 javascript 人,但我如何将您的解决方案应用于我发布的 javascript 代码?我需要使用该代码..谢谢
    • Imad,我不知道把这个 放在哪里?你能澄清一下吗?谢谢
    【解决方案3】:

    您可以使用 name 属性和网格 id 来查找它:

    <asp:TextBox ID="txt_UID" name="mytextbox" runat="server" Text='<%# Eval("UID")%>'
            Width="130px" BackColor="LightGoldenrodYellow"></asp:TextBox>
    

    javascript部分:

    $("#<%=MyGrid.ClientID %>[name=mytextbox]").autocomplete({});
    

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多