服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#实现无限级联下拉列表框

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

2021-11-15 14:37C#教程网 C#

这篇文章主要为大家详细介绍了C#实现无限级联下拉列表框的相关资料,感兴趣的小伙伴们可以参考一下

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

可能有一个树型结构的表,它可能有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级无限下拉列表框就做好了,感谢大家的阅读。

延伸 · 阅读

精彩推荐
  • C#Unity3D UGUI实现缩放循环拖动卡牌展示效果

    Unity3D UGUI实现缩放循环拖动卡牌展示效果

    这篇文章主要为大家详细介绍了Unity3D UGUI实现缩放循环拖动展示卡牌效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    诗远3662022-03-11
  • C#C#直线的最小二乘法线性回归运算实例

    C#直线的最小二乘法线性回归运算实例

    这篇文章主要介绍了C#直线的最小二乘法线性回归运算方法,实例分析了给定一组点,用最小二乘法进行线性回归运算的实现技巧,具有一定参考借鉴价值,需要...

    北风其凉8912021-10-18
  • C#C# 后台处理图片的几种方法

    C# 后台处理图片的几种方法

    本篇文章主要介绍了C# 后台处理图片的几种方法,非常具有实用价值,需要的朋友可以参考下。...

    IT小伙儿10162021-12-08
  • C#c#学习之30分钟学会XAML

    c#学习之30分钟学会XAML

    一个界面程序的核心,无疑就是界面和后台代码,而xaml就是微软为构建应用程序界面而创建的一种描述性语言,也就是说,这东西是搞界面的...

    C#教程网8812021-12-10
  • C#C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    这篇文章主要介绍了C#实现的文件操作封装类,结合完整实例形式分析了C#封装文件的删除,移动,复制,重命名等操作相关实现技巧,需要的朋友可以参考下...

    Rising_Sun3892021-12-28
  • C#聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题,新手速来围观,一个通俗易懂的例子帮助大家更好的理解C#接口问题,感兴趣的小伙伴们可以参考一下...

    zenkey7072021-12-03
  • C#C#基础之泛型

    C#基础之泛型

    泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。接下来通过本文给大家介绍c#基础之泛型,感兴趣的朋友一起学习吧...

    方小白7732021-12-03
  • C#浅谈C# winForm 窗体闪烁的问题

    浅谈C# winForm 窗体闪烁的问题

    下面小编就为大家带来一篇浅谈C# winForm 窗体闪烁的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网7962021-12-21