【问题标题】:Dynamically populate a checkbox list control动态填充复选框列表控件
【发布时间】:2012-06-25 00:59:08
【问题描述】:

下一个场景我已经搞砸了几个小时:

  • 当用户在文本框中键入一些文本时动态填充复选框列表(某种自动完成扩展器)。

正如我之前告诉你的,我已经搞砸了几个小时(几乎一整天),但仍然找不到正确的方法。起初我想到的是使用动态填充控件和网络方法,但无法使其工作。有什么建议么?

提前致谢。

已编辑:我正在尝试做的是一种 hotmail 功能。当您点击新电子邮件然后点击“收件人:”按钮时,它会弹出一个小窗口。

【问题讨论】:

  • 您是否有一个文本框,用户可以在其中键入文本并在每个击键上相应地创建复选框列表?您的查找列表有多大?
  • 我将在用户列表中执行搜索(在输入 4 个字母后开始搜索)。就像一个自动完成扩展器。
  • 理想情况下,您应该使用 jquery 和 ajax 调用一些自定义 Web 服务函数来进行用户查找。然后,您可以动态构建复选框的无序列表。如果您打算使用回发来做这将非常慢

标签: c# asp.net ajax asp.net-ajax


【解决方案1】:

代码如下:

首先我用这个函数创建了名为 Lookup.asmx 的 asmx Web 服务:

[WebMethod]
public GetUsersResponse[] LoadUsers()
{
    if (HttpContext.Current.Session["Users"] != null) 
    {
        return (List<GetUsersResponse>)HttpContext.Current.Session["Users"];
    }

    return new List<GetUsersResponse>();

}

[WebMethod]
public GetUsersResponse[] GetUsers(string query)
{
    var users = new List<string>
    {
        "Brad Pitt",
        "Brad Pitt2",
        "Brad Pitt3",
        "Angelina Jolie",
        "Jeniffer Aniston",
        "Tom Cruise",
        "Katie Holmes",
        "Tom Hanks",
        "Sean Pen",
        "Jude Law",
        "Bruce Willis"
    };

    var returnUsers = users.Where(s => s.ToLower().Trim().StartsWith(query.ToLower().Trim()))
                     .Select(s => new GetUsersResponce { Name = s })
                     .ToArray();

    HttpContext.Current.Session["Users"] = returnUsers;
    HttpContext.Current.Session["Query"] = query;
    return returnUsers;
}

public class GetUsersResponse
{
    public string Name { get; set; } 
}

确保取消注释 web 服务中的 [System.Web.Script.Services.ScriptService] 注释。然后我用了这个jquery/html(别忘了引用jquery):

<script type="text/javascript">
    $(function () {
        $.ajaxSetup({ type: 'POST', dataType: 'json', contentType: 'application/json', data: {} });

        $.ajax({
            url: 'Lookup.asmx/LoadUsers',
            data: '',
            success: function (data) {
                var responseJson = data.d; 
                if (responseJson.length > 0) {
                    $.each(responseJson, function () {
                        $("#result").append("<li><input type='checkbox'>" + this.Name + "</input></li>")                                    
                    });
                }
            }
        });



        $("#txtType").keyup(function () {
            var input = $(this).val();
            $("#result").html("");
            if (input && input.length > 3) {
                $.ajax({
                    url: 'Lookup.asmx/GetUsers',
                    data: '{ "query": "' + input + '" }',
                    success: function (data) {
                        var responseJson = data.d; 
                        if (responseJson.length > 0) {
                            $.each(responseJson, function () {
                                $("#result").append("<li><input type='checkbox'>" + this.Name + "</input></li>")                                    
                            });
                        }
                    }
                });

            }
        });
    });
</script>
<table cellpadding="5">
    <tr>
        <td>Search</td>
        <td><asp:TextBox ID="txtType" runat="server" ClientIDMode="Static" /></td>
    </tr>
    <tr>            
        <td colspan="2">
            <ul id="result" style="list-style: none;">
            </ul>
        </td>
    </tr>
</table>

然后你可以很容易地使用 jquery 来查看哪些复选框被选中了。

【讨论】:

  • @LuisHernandez 请将其标记为答案,如果可行,请 +1
  • 对不起,我有点忙,我刚刚实施了您提供的解决方案并且它有效。现在的问题是它在另一个文本框回发时失去了它的属性。非常感谢。
  • 非常感谢您的回答。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多