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

 更新时间:2016年03月07日 17:00:24   投稿:lijiao  
这篇文章主要为大家详细介绍了C#实现无限级联下拉列表框的相关资料,感兴趣的小伙伴们可以参考一下

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

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

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

效果图:

两个问题:

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

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

实现:

JS代码

<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#代码:

#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#拼接下拉列表框相关:

/// <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#得到同一深度的节点(同辈节点)相关:

/// <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相关:

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页面代码相关:

 @Html.Raw(ViewData["edit"].ToString())

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

/// <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# Request.Form用法案例详解

    C# Request.Form用法案例详解

    这篇文章主要介绍了C# Request.Form用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • DevExpress实现根据行,列索引来获取RepositoryItem的方法

    DevExpress实现根据行,列索引来获取RepositoryItem的方法

    这篇文章主要介绍了DevExpress实现根据行,列索引来获取RepositoryItem的方法,需要的朋友可以参考下
    2014-08-08
  • C#生成互不相同随机数的实现方法

    C#生成互不相同随机数的实现方法

    这篇文章主要介绍了C#生成互不相同随机数的实现方法,文中详细描述了C#生成互不相同随机数的各个步骤及所用到的函数,非常具有借鉴价值,需要的朋友可以参考下
    2014-09-09
  • C#实现获取文件夹大小的方法

    C#实现获取文件夹大小的方法

    这篇文章主要介绍了C#实现获取文件夹大小的方法,实例分析了两种获取方法,涉及C#针对文件夹操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 用C#来解析PDF文件

    用C#来解析PDF文件

    这篇文章主要介绍了用C#来解析PDF文件,同时作者也介绍了PdfFileAnalyzer这个应用可以作为很好的成品示例,需要的朋友可以参考下
    2015-07-07
  • C#中使用jieba.NET、WordCloudSharp制作词云图的步骤

    C#中使用jieba.NET、WordCloudSharp制作词云图的步骤

    之前一篇文章介绍的是使用Python的jieba、wordcloud的库生成词云图,本文则介绍在C#中如何使用jieba.NET、WordCloudSharp库生成词云图,感兴趣的朋友一起看看吧
    2021-07-07
  • 浅析WPF中ToolTip工具提示的应用

    浅析WPF中ToolTip工具提示的应用

    在日常应用中,当鼠标放置在某些控件上时,都会有相应的信息提示,从软件易用性上来说,这是一个非常友好的功能设计,本文就来和大家简单聊聊WPF中ToolTip工具提示的相关使用,有兴趣的可以了解下
    2023-12-12
  • C#设计模式之观察者模式实例讲解

    C#设计模式之观察者模式实例讲解

    这篇文章主要介绍了C#设计模式之观察者模式实例讲解,本文详细讲解了观察者模式的定义、优缺点、代码实例等,需要的朋友可以参考下
    2014-10-10
  • 浅解关于C#多线程的介绍

    浅解关于C#多线程的介绍

    本篇文章小编将为大家介绍,浅解关于C#的多线程,有需要的朋友可以参考一下
    2013-04-04
  • C#设置输入法实例分析

    C#设置输入法实例分析

    这篇文章主要介绍了C#设置输入法的方法,实例分析了C#获取系统输入法及设置输入法的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论