C#实现无限级联下拉列表框

时间:2022-06-19 13:13:59

本文实例为大家分享了无限级联下拉列表框的的实现方法,具体内容如下

可能有一个树型结构的表,它可能有id,name,parentid,level等字段,下面要实现的就是从一级节点开始,一级一级的列出来,并以

下拉列表框的形式体现出来,就像是n级联动。

效果图:

C#实现无限级联下拉列表框

两个问题:

1、建立操作时的联动,它不需要进行自动绑定

2、编辑操作时的联运,它需要根据子节点,逐级自己绑定到父节点,直到根

实现:

js代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script type="text/javascript">
  function areaonselect(obj) {
    var res = '';
    $.ajax({ url: '@url.action("getsubtree")',
      type: 'get',
      data: { parentid: obj.value },
      success: function (msg) {
        $(obj).nextall().remove();
        res = "<select name='sub' onchange='areaonselect(this)'>";
        res += "<option value=''>请选择</option>";
        $.each(msg, function (i, item) {
          res += "<option value='" + item["id"] + "'>" + item["name"] + "</option>";
        });
        res += "</select>";
        if ($(res).find("option").size() > 1)
          $(obj).after(res);
      }
    });
  }
</script>

c#代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#region 树型结构相关
    /// <summary>
    /// 递归找老祖宗
    /// </summary>
    /// <param name="father"></param>
    void getfather(subitem father)
    {
      if (father != null)
      {
        father.parent = _sublist.firstordefault(i => i.id == father.parentid);
        getfather(father.parent);
      }
    }
 
    /// <summary>
    /// 弟妹找子孙
    /// </summary>
    /// <param name="father">父对象</param>
    void getsons(subitem father)
    {
      if (father != null)
      {
        father.sons = _sublist.where(item =>
          item.parentid.equals(father.id)).tolist();
        father.sons.foreach(item =>
        {
          item.parent = father;
          getsons(item);
        });
      }
    }
 
 
    #endregion

c#拼接下拉列表框相关:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/// <summary>
    /// 递归得到它的所有祖宗以selectlist的形式进行拼接
    /// </summary>
    /// <param name="son"></param>
    /// <param name="sbr"></param>
    void getselectlist(subitem son, stringbuilder sbr)
    {
      stringbuilder insbr = new stringbuilder();
      if (son != null)
      {
        if (son.parentid == 0)
          insbr.append("<select name='parent' onchange = 'areaonselect(this)' >");
        else
          insbr.append("<select name='sub'>");
        getcommon_categorybylevel(son.level).tolist().foreach(i =>
        {
          if (i.id == son.id)
            insbr.append("<option value='" + i.id + "' selected='true'>" + i.name + "</option>");
          else
            insbr.append("<option value='" + i.id + "'>" + i.name + "</option>");
        });
 
        insbr.append("</select>");
        sbr.insert(0, insbr);
        getselectlist(son.parent, sbr);
      }
    }

c#得到同一深度的节点(同辈节点)相关:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
    /// 得到指定深度的列表
    /// </summary>
    /// <param name="level"></param>
    /// <returns></returns>
    public list<subitem> getcommon_categorybylevel(int level)
    {
      var linq = from data1 in _sublist
            join data2 in _sublist on data1.parentid equals data2.id into list
            select new subitem
            {
              id = data1.id,
              level = data1.level,
              name = data1.name,
              parent = list.firstordefault(),
              parentid = data1.parentid,
            };
      return linq.where(i => i.level.equals(level)).tolist();
    }

mvc页面action相关:

?
1
2
3
4
5
6
7
8
9
10
public actionresult category(int? id)
    {
      viewdata["parent"] = new selectlist(_sublist.where(i => i.id == (id ?? 0)), "id", "name", id ?? 1);
      subitem current = _sublist.firstordefault(i => i.id == (id ?? 1));
      getfather(current);
      stringbuilder sbr = new stringbuilder();
      getselectlist(current, sbr);
      viewdata["edit"] = sbr.tostring();//修改时,进行绑定
      return view();
    }

mvc页面代码相关:

?
1
@html.raw(viewdata["edit"].tostring())

c#树型结构实体类相关:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/// <summary>
  /// 树型分类结构
  /// </summary>
  public class category
  {
    /// <summary>
    /// 父id
    /// </summary>
    public int parentid { get; set; }
    /// <summary>
    /// 树id
    /// </summary>
    public int id { get; set; }
    /// <summary>
    /// 树名称
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// 深度
    /// </summary>
    public int level { get; set; }
    /// <summary>
    /// 子孙节点
    /// </summary>
    public list<category> sons { get; set; }
    /// <summary>
    /// 父节点
    /// </summary>
    public category parent { get; set; }
  }

好了,现在我们的n级无限下拉列表框就做好了,感谢大家的阅读。