带线的无限级下拉树列表
列表 无限
2023-09-14 08:59:37 时间
好多年没写文章了
这里就分享点自己原创的一点破代码,效果如图下:
本人的提供的代码如下:
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
namespace Interface.Common
{
public interface IDropDownTree : IDisposable
{
/**//// summary
/// 返回Dictionary里分别对应ID,文本,如果没有子节点返回null
/// /summary
/// param name="parentID" 父节点ID /param
/// returns /returns
Dictionary string, string GetChildCategory(string parentID);
/**//// summary
/// 代码里写return new Interface.Common.DropDownTree(this);
/// /summary
DropDownTree DropDownTree
{
get;
}
}
public sealed class DropDownTree
{
IDropDownTree _DropDownTree;
public DropDownTree(IDropDownTree dropDownTree)
{
_DropDownTree = dropDownTree;
}
/**//// summary
/// 用于树的前缀
/// /summary
/// param name="IsLast" 是否是同级节点中的最后一个 /param
/// param name="HasChild" 本节点是否拥有子节点 /param
/// param name="ParentString" 父节点前缀符号 /param
/// returns 本节点的前缀 /returns
private string GetPreFix(bool isLast, bool hasChild, string parentString)
{
string result = string.Empty;
if (!string.IsNullOrEmpty(parentString))
{
parentString = parentString.Remove(parentString.Length - 1).Replace("├", "│").Replace("└", " ");
result += parentString;
}
if (isLast)
{
result += "└";
}
else
{
result += "├";
}
if (hasChild)
{
result += "┬";
}
else
{
result += "─";
}
return result;
}
绑定下拉菜单#region 绑定下拉菜单
/**//// summary
/// 绑定连动级的下拉菜单
/// /summary
/// param name="ddlGoodsType" 传进一个被绑定的DropDownList /param
/// param name="removeID" 被排除绑定的节点ID /param
/// param name="AutoDispose" 是否自动释放 /param
public void BindToDropDownList(DropDownList ddlGoodsType, string removeID,string parentID, bool autoDispose)
{
if (ddlGoodsType != null)
{
ListItem listItem = null;
string currentID = parentID;//根节点/父ID
string currentSign = string.Empty;//当前节点符号;
string parrentSign = string.Empty; //父节点符号;
bool HasChild = true;//是否有子
Queue string parentKeyList = new Queue string //存 有子节点的 节点ID
Queue string parentSignList = new Queue string //对应节点ID的前缀符号
int itemIndexOf = 0;//父节点所在的位置
while (HasChild)
{
int lastOneCount = 1;//用于计算在同级别中是否最后一个
Dictionary string, string childList = _DropDownTree.GetChildCategory(currentID);// 得到子节点列表
if (childList != null childList.Count 0)
{
if (!string.IsNullOrEmpty(removeID) childList.ContainsKey(removeID))
{
childList.Remove(removeID);
}
foreach (KeyValuePair string, string entry in childList)
{
if (_DropDownTree.GetChildCategory(entry.Key) != null)//存在子
{
currentSign = GetPreFix(lastOneCount == childList.Count, true, parrentSign);
listItem = new ListItem(currentSign + entry.Value, entry.Key);
parentKeyList.Enqueue(entry.Key);//当前的节点ID
parentSignList.Enqueue(currentSign);//当前的节点符号
}
else//不存在子
{
currentSign = GetPreFix(lastOneCount == childList.Count, false, parrentSign);
listItem = new ListItem(currentSign + entry.Value, entry.Key);
}
if (ddlGoodsType.Items.Count != 0)
{
itemIndexOf = string.IsNullOrEmpty(currentID) ? itemIndexOf + 1 : ddlGoodsType.Items.IndexOf(ddlGoodsType.Items.FindByValue(currentID)) + lastOneCount;
}
ddlGoodsType.Items.Insert(itemIndexOf, listItem);//添加子节点
lastOneCount++;
}
if (parentKeyList.Count 0)//存在子节点时
{
currentID = parentKeyList.Dequeue();
parrentSign = parentSignList.Dequeue();
}
else
{
HasChild = false;
}
}
else
{
break;
}
}
if (autoDispose)
{
_DropDownTree.Dispose();
}
}
}
/**//// summary
/// 绑定连动级的下拉菜单
/// /summary
/// param name="ddlGoodsType" 传进一个被绑定的DropDownList /param
public void BindToDropDownList(DropDownList ddlGoodsType)
{
BindToDropDownList(ddlGoodsType, string.Empty,null, true);
}
/**//// summary
/// 绑定连动级的下拉菜单
/// /summary
/// param name="ddlGoodsType" 传进一个被绑定的DropDownList /param
/// param name="removeID" 被排除的ID /param
public void BindToDropDownList(DropDownList ddlGoodsType, string removeID)
{
BindToDropDownList(ddlGoodsType, removeID,null, true);
}
/**//// summary
/// 绑定连动级的下拉菜单
/// /summary
/// param name="ddlGoodsType" 传进一个被绑定的DropDownList /param
/// param name="removeID" 被排除的ID,若没有,传null /param
/// param name="parentID" 起始父ID /param
public void BindToDropDownList(DropDownList ddlGoodsType, string removeID,string parentID)
{
BindToDropDownList(ddlGoodsType, removeID,parentID, true);
}
#endregion
}
}
调用方法很简单:
1.继承自IDropDownTree接口
2.实现3个接口方法
实现接口代码示例[Dispose方法自己实现],最主要的是自己实现获得子级的方法
IDropDownTree 成员#region IDropDownTree 成员
public Dictionary string, string GetChildCategory(string parentID)
{
string where = "ParentID=" + parentID + "";
if (string.IsNullOrEmpty(parentID))
{
where = "ParentID is null or ParentID=" + Guid.Empty + "";
}
List GoodsCategoryBean _GoodsCategoryList = SelectList(0, where, string.Empty, false);
if (_GoodsCategoryList != null _GoodsCategoryList.Count 0)
{
Dictionary string, string categoryList = new Dictionary string, string
for (int i = 0; i _GoodsCategoryList.Count; i++)
{
categoryList.Add(_GoodsCategoryList[i].ID.ToString(), _GoodsCategoryList[i].GategoryName);
}
return categoryList;
}
return null;
}
public Interface.Common.DropDownTree DropDownTree
{
get { return new Interface.Common.DropDownTree(this); }
}
#endregion 页面调用代码: 类名.DropDownTree.BindToDropDownList(下拉控件ID);
希望对大伙有点帮助....
一.浮动布局 1.先让固定宽度的div浮动!使其脱离文档流。 2.margin-left的值等于固定div的宽度相等。
HorizontalScrollView包裹RecyclerView,使用StaggeredGridLayoutManager均分网格形成表格状列表,不固定列,每次刷新数据列位置异常错乱变动问题 问题描述:用Horizon...