背景
Tag在WinForm控件中经常被用来存储临时数据,类型为object,但是当程序中多个地方使用到Tag时,容易造成Tag使用的混乱,Tag是如此重要的一个属性,应该要好好考虑下如何有效的使用Tag服务于程序开发。
借鉴Web开发时,Js可以通过自定义属性,将状态绑定到Dom节点的自定义Attribute上,这也是绝大多数js插件,附加状态数据的方式。如果把字典引入到Tag中,规范约定Tag就是一个键值对组成的字典,那么对状态的存取就不会局限于一个状态,而且通过有效的管理可以更大化的发挥Tag字段的优势
基于以上想法,订立此Tag使用规范
winform控件Tag的常常用来临时存储依附于控件的数据,为了避免控件使用过程中,tag不易管理的问题,对tag使用进行一些规范。 不要直接对控件Tag进行操作, 而是使用Control上的如下四个扩展方法
一个使用示例
附录:TreeFilterHelper的实现
public class TreeFilterHelper
{ #region [Field] private readonly TreeList _tree;
private readonly TextEdit _edit;
private readonly List<TreeListNode> _collapseNodes = new List<TreeListNode>(); #endregion #region [Public] /// <summary>
/// 构造函数
/// </summary>
/// <param name="tree">要实现筛选功能的TreeList控件</param>
/// <param name="edit"></param>
/// <param name="immediate"></param>
public TreeFilterHelper(TreeList tree, TextEdit edit, bool immediate)
{
if (tree == null||edit == null) { return; }
_tree = tree;
_edit = edit;
InitTreeList();
if (immediate)
{
_edit.TextChanged += (sender, e) =>
{
FilterText(_edit.Text.Trim());
};
}
} private void InitTreeList()
{
_tree.OptionsBehavior.EnableFiltering = true;
_tree.OptionsFilter.FilterMode = FilterMode.Extended;
_tree.HideFindPanel();
} /// <summary>
/// 筛选文字
/// </summary>
/// <param name="text">要筛选的文字</param>
public void FilterText(string text)
{
if (string.IsNullOrWhiteSpace(text))
{
ClearFilter();
}
else
{
if (_collapseNodes.Count == )
{
if (_tree.HasChildren)
{
AppendCollapseNodes(_tree.Nodes);
}
}
_tree.SuspendLayout();
_tree.ExpandAll();
_tree.ApplyFindFilter(text);
_tree.ResumeLayout();
}
} private void AppendCollapseNodes(TreeListNodes nodes)
{
var eor = nodes.GetEnumerator();
while (eor.MoveNext())
{
var node = eor.Current as TreeListNode;
if (node == null) { continue; }
if (!node.Expanded)
{
_collapseNodes.Add(node);
}
if (node.HasChildren)
{
AppendCollapseNodes(node.Nodes);
}
}
} /// <summary>
/// 清除筛选
/// </summary>
public void ClearFilter()
{
_tree.ApplyFindFilter(string.Empty);
if (_collapseNodes == null) return;
_tree.SuspendLayout();
_collapseNodes.ForEach(one => one.Expanded = false);
_collapseNodes.Clear();
_tree.ResumeLayout();
} #endregion }
通过以上代码实现了TreeFilterHelper状态记录对象,附加于TreeList控件,需要过滤TreeList时,只需按照规范取出Tag中的TreeFilterHelper,调用其相应方法。
文章作者:花生(OutMan)
发布地址:http://www.cnblogs.com/WangHuaiSheng/ 发布时间:2017-12-02 本文版权归作者和博客园共有,欢迎转载, 但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接。 |