背景

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

本文版权归作者和博客园共有,欢迎转载,

但未经作者同意必须保留此段声明,

且在文章页面明显位置给出原文连接。

 

 

Winform控件Tag使用规范的更多相关文章

  1. C#中常见的winform控件命名规范

    我们知道Button 常常简称为btn,那么Winform中的其它控件呢,这篇文章在C#的winform控件命名规范 的基础上对一些控件的名称的简称进行了整理. 1. 标准控件 NO. 控件类型简写 ...

  2. C#中常见的winform控件命名规范 转

    我们知道Button 常常简称为btn,那么Winform中的其它控件呢,这篇文章在C#的winform控件命名规范 的基础上对一些控件的名称的简称进行了整理. 1. 标准控件 NO. 控件类型简写 ...

  3. [工作札记]02: .Net Winform控件TreeView最简递归绑定方法

    前言:Treeview控件是我们在WinForm.WebForm开发中经常使用的控件,需要从数据库动态加载数据,然后递归绑定每一个节点:同样,递归的思路在其他程序中也经常运用,包括.Net MVC等. ...

  4. 在WPF中使用WinForm控件方法

    1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2.      在要使用WinForm控 ...

  5. WPF 调用WinForm控件

    WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...

  6. WinForm控件TreeView 只部分节点显示 CheckBox

    WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示check ...

  7. Winform控件重写

    Winform控件重写 因为最近的项目中越来越多的遇到了比较特殊的一些控件,有时候我们自己封装一下可能更加方便我们的使用,下面是我们项目中用到的,简单做一个记录. TextBox控件重写 主要的控制代 ...

  8. 通过WinForm控件创建的WPF控件无法输入的问题

    今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子 ...

  9. c#Winform控件总结

    1. C# WinForm控件.自定义控件整理(大全) (http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html) 2. c#窗体控件用 ...

随机推荐

  1. ES6的Iterator遍历器

    JS表示集合的对象主要有Array.Set.Object.Map,在以前,遍历它们需要使用2种不同的方法,而现在,JS提出了Iterator机制,可以给不同的数据结构提供统一的遍历方法,就是for…o ...

  2. 【转】CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  3. Java 从键盘输入

    package io; import java.io.*; public class ReadAndWrite { public static void main(String[] args) { I ...

  4. sql执行报错--This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

    问题: 不支持使用 LIMIT 子句的 IN/ALL/ANY/SOME 子查询,即是支持非 IN/ALL/ANY/SOME 子查询的 LIMIT 子查询. 解决: 将语句:select * from ...

  5. LeetCode 118. Pascal's Triangle (杨辉三角)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  6. LeetCode 1. Two Sum (两数之和)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  7. C# 8.0的三个令人兴奋的新特性

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新.同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高 ...

  8. Akka(34): Http:Unmarshalling,from Json

    Unmarshalling是Akka-http内把网上可传输格式的数据转变成程序高级结构话数据的过程,比如把Json数据转换成某个自定义类型的实例.按具体流程来说就是先把Json转换成可传输格式数据如 ...

  9. 读书笔记-你不知道的JS中-promise

    之前的笔记没保存没掉了,好气,重新写! 填坑-- 现在与将来 在单个JS文件中,程序由许多块组成,这些块有的现在执行,有的将来执行,最常见的块单位是函数. 程序中'将来'执行的部分并不一定在'现在'运 ...

  10. css3+div画大风车

    今天已经礼拜三了,周天小颖家的佩佩就要结婚啦,小颖要去当伴娘了,哈哈哈哈哈哈,想想都觉得乐开了花,不过之前她给我说让我当她伴娘时,我说我要减肥,不然她那么瘦弱,我站旁边就感觉像一个圆滚滚的小皮球,小颖 ...