找回密码
 立即注册

QQ登录

只需一步,快速开始

小k的大师兄

初级会员

13

主题

60

帖子

380

积分

初级会员

积分
380

[已处理] 树形单元格

小k的大师兄
初级会员   /  发表于:2020-10-21 15:50  /   查看:3142  /  回复:9
1.请问是否有树形单元格的例子?类似下图: image.png554125365.png
2.如果自己扩展一个树形单元格类型,是否可以不使用HTC来实现?

9 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-10-21 18:06:30
沙发
1.目前没有树形单元格的类型和示例

2. 自定义单元格类型,可以通过继承GeneralCellType来实现,下面的链接是一个类似的博客,但是这个树状节点不是单元格里本身的,只供参考自定义单元格实现的思路

https://www.grapecity.com.cn/blo ... jiegouxianshifangan
这里还有另外一个介绍自定义单元格的教程
https://www.grapecity.com/blogs/ ... d-custom-cell-types
回复 使用道具 举报
小k的大师兄
初级会员   /  发表于:2020-10-22 08:46:19
板凳
我自己重写了一个树形下拉框单元格类型,但是在选择下拉值的时候无法选择,选值的时候好像页面又重新刷新了一次。如下图:
image.png899725036.png
重新单元格类型代码如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.ComponentModel;
  7. using System.Collections;
  8. using System.Collections.Specialized;
  9. using System.Web.UI;
  10. using System.Web.UI.WebControls;

  11. using FarPoint.Web.Spread;
  12. using FarPoint.PDF;
  13. using FarPoint.Web.Spread.Editor;
  14. using FarPoint.Web.Spread.Model;
  15. using FarPoint.Web.Spread.Renderer;
  16. using System.Xml;

  17. namespace JrscInfoSysEn.SpreadImp
  18. {
  19.     /// <summary>
  20.     /// 树形下拉框
  21.     /// </summary>
  22.     [Serializable]
  23.     public class TreeComboBoxCellType : GeneralCellType
  24.     {
  25.         /// <summary>
  26.         /// 数据名称集合
  27.         /// </summary>
  28.         private string[] _Items;

  29.         /// <summary>
  30.         /// 数据值集合
  31.         /// </summary>
  32.         private string[] _Values;

  33.         private int[] _Levels;

  34.         /// <summary>
  35.         /// 获取或设置数据名称集合
  36.         /// </summary>
  37.         public string[] Items
  38.         {
  39.             set
  40.             {
  41.                 _Items = value;
  42.             }
  43.             get
  44.             {
  45.                 return _Items;
  46.             }
  47.         }

  48.         /// <summary>
  49.         /// 获取或设置数据值集合
  50.         /// </summary>
  51.         public string[] Values
  52.         {
  53.             set
  54.             {
  55.                 _Values = value;
  56.             }
  57.             get
  58.             {
  59.                 return _Values;
  60.             }
  61.         }

  62.         /// <summary>
  63.         /// 获取或设置数据层级集合
  64.         /// </summary>
  65.         public int[] Levels
  66.         {
  67.             set
  68.             {
  69.                 _Levels = value;
  70.             }
  71.             get
  72.             {
  73.                 return _Levels;
  74.             }
  75.         }

  76.         /// <summary>
  77.         /// 初始化类TreeComboBoxCellType的新实例
  78.         /// </summary>
  79.         public TreeComboBoxCellType()
  80.             : base()
  81.         {

  82.         }

  83.         /// <summary>
  84.         /// 获取用于编辑单元格的控件
  85.         /// </summary>
  86.         /// <param name="id">控件的唯一标识符</param>
  87.         /// <param name="parent"></param>
  88.         /// <param name="style"></param>
  89.         /// <param name="margin"></param>
  90.         /// <param name="value"></param>
  91.         /// <param name="upperLevel"></param>
  92.         /// <returns></returns>
  93.         public override Control GetEditorControl(string id, TableCell parent, Appearance style, Inset margin, object value, bool upperLevel)
  94.         {
  95.             Label label = new Label();

  96.             TreeView view = new TreeView();
  97.             view.ImageSet = TreeViewImageSet.Arrows;
  98.             view.BorderColor = System.Drawing.Color.CadetBlue;
  99.             view.BorderStyle = BorderStyle.Solid;
  100.             view.BorderWidth = 1;
  101.             view.ShowExpandCollapse = true;
  102.             view.ShowLines = true;
  103.             view.Attributes.Add("style", "text-align :left");
  104.             view.Height = new Unit(250);
  105.             view.Width = new Unit("100%");
  106.             view.Style.Add("overflow", "auto");
  107.             view.BackColor = System.Drawing.Color.White;
  108.             view.Font.Size = 9;
  109.             view.HoverNodeStyle.Font.Bold = true;
  110.             view.HoverNodeStyle.ForeColor = System.Drawing.Color.Blue;
  111.             view.NodeStyle.ForeColor = System.Drawing.Color.Black;

  112.             if (Items != null && Items.Length > 0)
  113.             {
  114.                 CreateTreeView(view, Items, Values, Levels);
  115.             }
  116.             view.ExpandAll();

  117.             Panel panel = new Panel();
  118.             panel.Style.Add(HtmlTextWriterStyle.Cursor, "cursor");
  119.             label.Controls.Add(panel);
  120.             label.Controls.Add(view);

  121.             Panel panel2 = new Panel();
  122.             panel2.Style.Add(HtmlTextWriterStyle.Cursor, "cursor");

  123.             label.Controls.Add(panel2);
  124.             label.Style.Add(HtmlTextWriterStyle.ZIndex, "999");

  125.             return label;
  126.         }

  127.         public override string EditorClientScriptUrl
  128.         {
  129.             get
  130.             {
  131.                 var tt = base.EditorClientScriptUrl;
  132.                 return tt;
  133.             }
  134.         }

  135.         /// <summary>
  136.         /// 基于此类型派生单元格类型时,重写此选项可更改从数据模型中的对象传回并格式化为字符串的内容
  137.         /// </summary>
  138.         /// <param name="obj"></param>
  139.         /// <returns></returns>
  140.         public override string Format(object obj)
  141.         {
  142.             if (Values != null && Values.Length > 0)
  143.             {
  144.                 for (int i = 0; i < Items.Length; i++)
  145.                 {
  146.                     if (Values[i] == obj.ToString().Trim())
  147.                     {
  148.                         return Items[i];
  149.                     }
  150.                 }

  151.                 return null;
  152.             }
  153.             else
  154.             {
  155.                 return base.Format(obj);
  156.             }
  157.         }

  158.         /// <summary>
  159.         /// 当基于此类型派生单元格类型时,重写此选项以更改从工作表上的单元格解析的内容并放入数据模型中。
  160.         /// </summary>
  161.         /// <param name="s"></param>
  162.         /// <returns></returns>
  163.         public override object Parse(string s)
  164.         {
  165.             if (string.IsNullOrEmpty(s))
  166.             {
  167.                 return base.Parse(s);
  168.             }

  169.             if (Items != null && Items.Length > 0)
  170.             {
  171.                 for (int i = 0; i < Items.Length; i++)
  172.                 {
  173.                     if (Items[i] == s.Trim())
  174.                     {
  175.                         return Values[i];
  176.                     }
  177.                 }

  178.                 return null;
  179.             }
  180.             else
  181.             {
  182.                 return base.Parse(s);
  183.             }
  184.         }

  185.         /// <summary>
  186.         /// 序列化
  187.         /// </summary>
  188.         /// <param name="xmlWriter"></param>
  189.         /// <returns></returns>
  190.         public override bool Serialize(XmlTextWriter xmlWriter)
  191.         {
  192.             xmlWriter.WriteStartElement("CellTypeAtrribute");
  193.             if (Items == null)
  194.             {
  195.                 xmlWriter.WriteElementString("ItemsCount", "0");
  196.                 xmlWriter.WriteEndElement();
  197.             }
  198.             else
  199.             {
  200.                 xmlWriter.WriteElementString("ItemsCount", Items.Length.ToString());
  201.                 xmlWriter.WriteEndElement();
  202.                 xmlWriter.WriteStartElement("Items");
  203.                 for (int i = 0; i < Items.Length; i++)
  204.                 {
  205.                     xmlWriter.WriteElementString("item", Items[i]);
  206.                     xmlWriter.WriteElementString("value", Values[i]);
  207.                     xmlWriter.WriteElementString("level", Levels[i].ToString());
  208.                 }
  209.                 xmlWriter.WriteEndElement();
  210.             }

  211.             return true;
  212.         }

  213.         /// <summary>
  214.         /// 反序列化
  215.         /// </summary>
  216.         /// <param name="xmlReader"></param>
  217.         /// <returns></returns>
  218.         public override bool Deserialize(XmlNodeReader xmlReader)
  219.         {
  220.             xmlReader.ReadStartElement();
  221.             int cnt = int.Parse(xmlReader.ReadElementString());
  222.             xmlReader.ReadEndElement();

  223.             if (cnt > 0)
  224.             {
  225.                 xmlReader.ReadStartElement();
  226.                 Items = new string[cnt];
  227.                 Values = new string[cnt];
  228.                 Levels = new int[cnt];
  229.                 for (int i = 0; i < cnt; i++)
  230.                 {
  231.                     _Items[i] = xmlReader.ReadElementString();
  232.                     _Values[i] = xmlReader.ReadElementString();
  233.                     _Levels[i] = int.Parse(xmlReader.ReadElementString());
  234.                 }
  235.                 xmlReader.ReadEndElement();
  236.             }

  237.             return true;
  238.         }

  239.         /// <summary>
  240.         /// 构造树形下拉框
  241.         /// </summary>
  242.         /// <param name="treeView">TreeView实例</param>
  243.         /// <param name="strText">数据名称集合</param>
  244.         /// <param name="strValue">数据值集合</param>
  245.         /// <param name="iLevel">层级集合</param>
  246.         private void CreateTreeView(TreeView treeView, string[] strText, string[] strValue, int[] iLevel)
  247.         {
  248.             if (strValue.Length == 0)
  249.             {
  250.                 return;
  251.             }

  252.             treeView.Nodes.Clear();

  253.             int _cnt = strValue.Length;
  254.             int parentLevel = -1;
  255.             TreeNode parentnode = null;
  256.             if (_cnt > 0)
  257.             {
  258.                 TreeNode node = new TreeNode();
  259.                 int level = iLevel[0];
  260.                 node.Text = strText[0];
  261.                 node.Value = strValue[0];
  262.                 parentLevel = level;
  263.                 treeView.Nodes.Add(node);

  264.                 parentnode = node;
  265.             }

  266.             for (int i = 1; i < _cnt; i++)
  267.             {
  268.                 TreeNode node = new TreeNode();

  269.                 int level = iLevel[i];
  270.                 node.Text = strText[i];
  271.                 node.Value = strValue[i];

  272.                 int k = level - parentLevel;
  273.                 while (k <= 0)
  274.                 {
  275.                     parentnode = parentnode.Parent as TreeNode;
  276.                     k++;
  277.                 }

  278.                 if (parentnode == null)
  279.                 {
  280.                     treeView.Nodes.Add(node);
  281.                 }
  282.                 else
  283.                 {
  284.                     parentnode.ChildNodes.Add(node);
  285.                 }

  286.                 parentnode = node;
  287.                 parentLevel = level;
  288.             }
  289.         }
  290.     }
  291. }
复制代码


回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-10-22 12:01:09
地板
本帖最后由 Richard.Ma 于 2020-10-27 09:33 编辑

问题比较复杂,我这边正在和研发沟通解决办法,可能需要两三天的时间,然后给您回复
回复 使用道具 举报
小k的大师兄
初级会员   /  发表于:2020-10-27 13:27:17
5#
你好 请问这个问题有办法解决吗?
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-10-27 15:07:47
6#
您好,还在研究解决方案,预计明天给您结果
回复 使用道具 举报
小k的大师兄
初级会员   /  发表于:2020-11-3 08:48:44
7#
你好 请问你们研究出解决方案了吗? 如果实在不行 我们就考虑别的方式。谢谢!
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-3 11:01:18
8#
您好,非常抱歉,这个问题确实目前暂时没有办法解决。研发那边可能也需一些时间来验证,
问题的跟踪编号为SPNET-13342。如果有结果后我会及时更新

暂时来说,我建议你这边可以考虑先用下拉列表来进行替换。通过对下拉项的文本设置来模拟树状的效果
回复 使用道具 举报
小k的大师兄
初级会员   /  发表于:2020-11-3 11:38:51
9#
好的 非常感谢 我们在采用别的方式处理 后续如果有相应的解决方案 麻烦告知一下 谢谢
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-3 12:03:52
10#
不客气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部