【问题标题】:Getting Columns Checked in GridView with jQuery使用 jQuery 在 GridView 中检查列
【发布时间】:2013-05-17 06:25:28
【问题描述】:

我有一个 GridView,需要抓取第 1 列和第 2 列(其中的文本)并将该文本放在页面的其他位置,即另一个文本框。

这是我目前所拥有的:

 var checked = $('input:checkbox').click(function(e) {
            //place airport in textbox, txtAirport
            var loc = $("tr:has(:checkbox:checked) td:nth-child(1)");
            var ac = $("tr:has(:checkbox:checked) td:nth-child(2)");

            // txtAirport.Text = loc + ac;
            $("#<%= txtAirport.ClientID%>").val(loc + ac);
        });

问题是我在我的文本框中得到了 {Object object} {Object object},我希望得到一个城市、街道和机场。如何澄清我的“loc”和“ac”变量以提供我需要的东西?我试过 .text 和 .val() 无济于事。

这是 HTML (ASP.NET Gridview):

 <asp:DataGrid ID="dgSearch" runat="server" AllowPaging="False" AllowSorting="False"
                            CellPadding="3" CellSpacing="2" ShowFooter="False" GridLines="None" AutoGenerateColumns="false">
                            <AlternatingItemStyle Wrap="False" CssClass="HeaderRowAlternate"></AlternatingItemStyle>
                            <ItemStyle Wrap="False"></ItemStyle>
                            <HeaderStyle Font-Bold="True" Wrap="False" CssClass="HeaderRowStyle"></HeaderStyle>
                            <Columns>
                                <asp:TemplateColumn HeaderText="Select">
                                    <HeaderStyle CssClass="HEADERSTYLE"></HeaderStyle>
                                    <ItemTemplate>
                                        <asp:CheckBox ID="chkLookup" runat="server" CssClass="checkbox"></asp:CheckBox>
                                    </ItemTemplate>
                                </asp:TemplateColumn>
                                <asp:BoundColumn Visible="False" DataField="AirportID"></asp:BoundColumn>
                                <asp:BoundColumn Visible="False" DataField="City"></asp:BoundColumn>
                                <asp:BoundColumn DataField="Loc" HeaderText="Location">
                                    <HeaderStyle Wrap="False" CssClass="HEADERSTYLE"></HeaderStyle>
                                    <ItemStyle Wrap="False"></ItemStyle>
                                </asp:BoundColumn>
                                <asp:BoundColumn DataField="AirportCode" HeaderText="Airport Code">
                                    <HeaderStyle Wrap="False" CssClass="HEADERSTYLE"></HeaderStyle>
                                    <ItemStyle Wrap="False"></ItemStyle>
                                </asp:BoundColumn>
                                <asp:BoundColumn DataField="AirportName" HeaderText="Airport Name">
                                    <HeaderStyle Wrap="False" CssClass="HEADERSTYLE"></HeaderStyle>
                                    <ItemStyle Wrap="False"></ItemStyle>
                                </asp:BoundColumn>
                                <asp:BoundColumn DataField="MilesFromSource" HeaderText="Distance">
                                    <HeaderStyle Wrap="False" CssClass="HEADERSTYLE"></HeaderStyle>
                                    <ItemStyle Wrap="False"></ItemStyle>
                                </asp:BoundColumn>
                            </Columns>
                        </asp:DataGrid>

【问题讨论】:

    标签: jquery asp.net


    【解决方案1】:

    jQuery 返回一个数组或匹配的对象,因此您需要使用loc[0].innerHTMLloc.html()loc.text() 而不是loc(或分别为ac)。

       var checked = $('input:checkbox').click(function(e) {
            //place airport in textbox, txtAirport
            var loc = $("tr:has(:checkbox:checked) td:nth-child(2)");
            var ac = $("tr:has(:checkbox:checked) td:nth-child(3)");
    
            // txtAirport.Text = loc + ac;
            $("#<%= txtAirport.ClientID%>").val(loc.html() + ac.html());
        });
    

    可能也需要更改单元格的数量(1,2 -> 2,3)参见http://jsfiddle.net/vXtKq/ 可能是您的选择器不够具体,但如果您发布上层代码或 渲染 HTML(来自浏览器中的页面源)的结果,则更容易找到解决方案。

    【讨论】:

    • 我在这里只使用“loc”作为变量。你能澄清一下吗?
    • 据我了解,loc 应该包含 jQuery 匹配的内容(var loc = $...),但它不是 中的文本,它是 jQuery 对象 - 通常是 HTML 对象数组。获取第一个 loc.html() 的内容。
    • 通过将其更改为我得到所需的列标题,但不是被点击的行的列的内容。
    • 有必要改变数字也看到更新的答案和例子。
    • 我想我已经知道了,但我需要能够抓取所有检查过的项目,而不仅仅是一个。要做到这一点,我必须以某种方式迭代?
    【解决方案2】:

    jQuery 选择器返回包含所选 DOM 元素的包装集,因此您需要使用 .text() 或 .html()

    编辑:好的,我已经复制了你的代码,你需要的是

    $("tr:has(:checkbox:checked) td:nth-child(2)");
    $("tr:has(:checkbox:checked) td:nth-child(3)");
    

    然后去做

    $("#<%= txtAirport.ClientID%>").val(loc[0].innerHTML + ac[0].innerHTML);
    

    这将为您提供第一行(loc[1] 和 ac[1] 用于第二行等)的第一列和第二列(复选框之后)中的文本。您遇到的问题是 td:nth-child(0) 正在返回复选框的 &lt;td&gt; 元素的 DOM 对象

    仅循环检查选中的复选框:

    for (var i = 0; i < loc.length; i++) {
        alert(loc[i].innerHTML + " " + ac[i].innerHTML);
    }
    

    你不需要选中复选框,因为 jQuery 选择器已经为你做了这个

    【讨论】:

    • .html() 给了我大量的 html,实际上太多了。好像我的变量不够明确。
    • 由于某种原因,我不断得到正确的列标题,而不是列数据。
    • 我将其更改为 loc[1].innerHTML 和 ac[1].innerHTML 并返回检查的第一行。现在我需要将已检查的其他值添加到我的文本框中。
    • 更新了如何遍历检查的行
    • 由于某种原因,当我在这里循环时,它会将最后一项放在 GridView 中(而不是选中的框)。有什么想法吗?
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签