jQuery UI自动完成 - ASP GridView

时间:2017-06-16 23:38:21

标签: jquery gridview webforms jquery-ui-autocomplete

我有一个继承了一个带有Gridview的Web窗体应用程序。网格视图列出了许多分配给它们的审计员和成本。在页脚模板中有空白文本框,允许用户向网格添加新条目。第一列包含审核员的名称,其中使用jQuery UI Autocomplete帮助用户添加审核员名称。

我遇到的问题是自动完成功能完全适用于添加的第一行。但是,如果用户希望在第一个记录之后添加多个记录,则自动完成功能将不起作用。

为了描绘一切是如何工作的全貌,自动填充数据被加载到隐藏字段

    private void BindAuditorAutoComplete()
    {
        var data = RetrievalProcedures.GetAuditors();
        hdAuditorData.Value = JsonObjectSerializer.ParseAuditorAutoComplete(data);
    }

这里是GridView的相关列 - 注意两个隐藏字段,第一个是DB记录ID(如果是编辑记录),第二个是所选审计员的ID值自动完成。

<asp:TemplateField HeaderText="Auditor Name">
    <HeaderStyle Width="315" />
    <ItemStyle Width="315" />
    <ItemTemplate>
        <asp:Label ID="lblExtraAuditorName" runat="server" Text='<%# Bind("ExtraAuditorName")%>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:Label ID="lblExtraAuditorName" runat="server" Text='<%# Bind("ExtraAuditorName")%>'></asp:Label>
        <uc:HiddenField2 ID="txtExtraAdditionalAuditorId" runat="server" Value='<%# Bind("ExtraAdditionalAuditorId")%>' />
        <uc:HiddenField2 ID="txtExtraAuditorId" runat="server" Value='<%# Bind("ExtraAuditorId")%>' />
    </EditItemTemplate>
    <FooterTemplate>
        <uc:HiddenField2 ID="txtExtraAdditionalAuditorId" runat="server" Value='<%# Bind("ExtraAdditionalAuditorId")%>' />
        <uc:HiddenField2 ID="txtExtraAuditorId" runat="server" />
        <asp:TextBox ID="txtExtraAuditorName" class="dummyAuditorAutoComplete" runat="server" Style="width: 305px;"></asp:TextBox>

    </FooterTemplate>
</asp:TemplateField>

这是加载自动完成的代码:

    function LoadAuditorExtraCostsAutoComplete() {

        $('.dummyAuditorAutoComplete').autocomplete({
            source: GetAuditorData(),
            select: function (event, ui) {
                PopulateAdditionalCostsAuditorData(ui);
                return false;
            },

            focus: function (event, ui) {
                PopulateAdditionalCostsAuditorData(ui);
                return false;
            },
            minLength: 1
        });
    }

GetAuditorData()只读取隐藏的字段值:

    function GetAuditorData() {
        var auditors = eval($("#<%=hdAuditorData.ClientID%>").val());
        return auditors;
    }

在select和focus事件中,运行以下函数:

    function PopulateAdditionalCostsAuditorData(ui) {
        $("#cphDetails_AdditionalCostsGrid_txtExtraAuditorName").val(ui.item.Name);
        $("#cphDetails_AdditionalCostsGrid_txtExtraAuditorId").val(ui.item.Id);
    }

注意:我知道在引用这两个字段时我可能应该使用服务器标记,但是Visual Studio给出了错误,告知txtExtraAuditorName / txtExtraAuditorId在当前上下文中不存在。问题可能与此有关,但我不确定如何解决它。

是否有人能够提供帮助,以便用户在添加一条记录后可以再次使用自动完成功能?提前谢谢!

1 个答案:

答案 0 :(得分:0)

对于那些想知道的人(如果有的话),在后面的代码中我有一个方法PopulateAdditionalCost(),每次添加或更改记录时都会调用它。我只是在其底部添加以下代码以重新加载自动完成控件

ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "myscr", "LoadAuditorExtraCostsAutoComplete();", true);