【问题标题】:Using jQuery in a GridView?在 GridView 中使用 jQuery?
【发布时间】:2010-04-02 16:34:55
【问题描述】:

我有一个传统的 ASP.NET GridView。在其中我有一个具有编辑功能的模板字段。我需要在编辑件上使用 jQuery 自动完成插件。它可以在除此 GridView 内部之外的任何地方工作。换句话说,我知道该插件有效。

这是 ASP.NET 的东西(是的,我使用的是 SqlDataSource):


这里是 document.ready() 中的 jQuery:

$('[id$=txtEditIngredients]').autocomplete("LookupCodes.aspx?type=IC", { mustMatch: true });

我在这里可能做错了什么?

【问题讨论】:

  • 可能需要用到<%= txtEditIngredients.ClientID %>

标签: asp.net jquery gridview


【解决方案1】:

我认为最好的方法是为文本框指定一个类并根据类而不是 ID 来处理它。

$('.AutoCompleteField').autocomplete("LookupCodes.aspx?type=IC", { mustMatch: true });

当我尝试使用 ID 访问 gridview 中的控件时遇到问题。

HTH

【讨论】:

  • 我正在尝试,但它仍然无法正常工作。是因为它在 EditTemplate 中吗?
  • 我从 UpdatePanel 中删除了 GridView,现在它可以工作了。想知道这是怎么回事?
【解决方案2】:

您将希望在项目模板中使用:

<%# ((GridViewRow)Container).FindControl("txtEditIngredients").ClientID %>

如果您查看渲染页面的源代码,您将看到 gridview 中文本框的控件 ID 不只是 txtEditIngredients,它具有预先附加的信息。

另一种选择是向文本框添加一个类并根据该类应用自动完成功能。这样他们就不会依赖 id

$('.ICLookup').autocomplete("LookupCodes.aspx?type=IC", { mustMatch: true });

此外,如果使用客户端 ID,请确保将特定 document.ready(): 放入 EditTemplate 以确保仅在编辑控件可见时才调用它。

【讨论】:

  • 其实这是错误的——你不能使用 因为页面上会有不止一个这些,而且只有一个 jQuery 调用,所以你需要在 jQuery 选择器中执行一些操作,将选择所有这些。
  • 我认为他是在暗示页面上只有一个。我假设他会为每个文本框的 ID 写一行。不知道是一个还是多个,我还建议他使用 Class 路由,为其添加多个控件。
  • 我已将 (document).ready 函数添加到 EditTemplate 但它仍然无法正常工作。我也选择了 Class 路线,但仍然没有获得绿灯。
  • 如果页面在网格视图中,为什么页面上只有一个 - 这绝对没有意义。
【解决方案3】:

好吧,既然您说它在更新面板中,那就更有意义了。更新面板中的代码不一定会在您的 jquery 运行时呈现。像我在其他答案中建议的那样使用 .size 发出警报将确认这一点。

如果您执行了 .live('autocomplete') 调用而不是 .autocomplete(),那么即使使用更新面板,它也应该可以工作。 jQuery .live 函数会导致将 jQuery 事件添加到与选择器匹配的所有控件,即使它们是在您进行调用之后添加的。详情请见http://api.jquery.com/live/

【讨论】:

    【解决方案4】:

    可以根据需要使用类来进行选择(正如其他人提到的那样),但对我来说,如果您只是为了这个目的而添加一个类并且您有一个 ID,那么您可以select with,好像有点浪费。

    我创建了一个非常简单的示例,它显示了您的操作方式(使用 [id$=txtField] 作为您的选择器确实可以与插件一起使用。这是 .aspx 代码:

    <head runat="server">
        <title></title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
        <script type="text/javascript" src="jquery.autocomplete.min.js"></script>
        <link type="text/css" href="jquery.autocomplete.css" rel="stylesheet" />
        <script type="text/javascript">
            $(function() {
                $('[id$=txtTest]').autocomplete(["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "pearl"], {
                    mustMatch: true
                });
            });
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <asp:GridView runat="server" ID="grdView" AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox runat="server" ID="txtTest" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        </div>
        </form>
    </body>
    </html>
    

    这是运行测试所需的代码隐藏更新:

    protected void Page_Load(object sender, EventArgs e)
    {
        List<string> data = new List<string>();
        data.Add("test");
        data.Add("test2");
        this.grdView.DataSource = data;
        this.grdView.DataBind();
    }
    

    如果您创建一个测试 webapp 并以此作为测试页面并运行它,自动完成功能将正常工作。

    由于这不适用于您的应用,您需要检查以确保您使用的选择器 ([id$=txtEditIngredients]) 确实匹配某些内容。要对此进行测试,请将此代码放在您的 document.ready 事件之前的位置:

    alert($('[id$=txtEditIngredients]').size());
    

    这应该会提醒一个数字,其中包含 GridView 中的行数。如果不是,请查看源代码并在您的某一行中找到该文本字段以查看 ID 是什么,并相应地调整您的选择器。

    编辑:我只是想补充一点,由于 .Net 控件命名结构,我一直在 jQuery/.Net 中使用 [id$=controlName],并且每次都能正常工作,所以这根本不应该是一个问题。

    【讨论】:

    • 在您的示例中,文本框的 ID 是“grdView_ctl02_txtTest”和“grdView_ctl03_txtTest”。您必须调用 $('[id$=grdView_ctl02_txtTest]')
    • 我也注意到,您的示例虽然很有帮助,但在 Edit 模板中没有 TextBox。那就是我的地方。不确定是否有所作为。
    • @Glennular - 不,你不会。 [id$=txtTest] 表示id以txtTest结尾,这就是为什么它适用于gridview中的所有实例
    • @Matt,您是否尝试过我的建议并查看 .size 为您的选择器返回了什么?
    • @Glennular - 感谢您在明显不了解 jQuery 选择器时投反对票。仅仅因为您的回答 100% 错误并不意味着您应该投票反对我,因为您不了解所讨论的内容。
    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多