转载请注明出处: http://blog.csdn.net/jh_zzz/
从来没有用过C#写过应用程序,甚至根本就懒得学习.Net相关的东西,因为在我的印象中.Net应用程序就是庞大而臃肿,效率低下,但自从最近见到了Paint.Net,DNN,SourceGrid这样一些开源项目,我的看法彻底的发生了改变,强大的语言使我们可以将更多的精力放在代码设计本身上,随着WindowsXP的普及和Vista的到来,必将有更多基于.Net的优秀应用程序诞生。
SourceGrid是一个纯C#语言编写的网格控件,实现了很多难以改决的问题.比如双列标题,跨行,跨列,Combox,Droplist,Button,Linkbutton,Checkbox,下拉,显示图片,排序,数据类型验证等等功能,也具有现有网格的支持数据源的功能,也支持导出csv,html,xml的功能。 ================================================================== 1. 控件如何处理与用户的交互: //Create the Controller list for the Cells m_Controller = new SourceGrid.Cells.Controllers.ControllerContainer(); m_Controller.AddController(Cells.Controllers.Cell.Default); //Grid Controllers mGridController = new DevAge.ComponentModel.Controller.ControllerContainer(this); mGridController.AddController(Controllers.Grid.Default); mGridController.AddController(Controllers.MouseSelection.Default); GridVirtual中m_Controller 及 mGridController是控制器的集合,负责将用户操作消息传递给所有注册的控制器,对外提供 Controller及GridController属性,可通过ControllerContainer的 AddController方法注册新的Controller对象。好像Controller是用来处理与Cell有关的操作消息,GridController则用来处理与Grid有关的操作消息。 public void OnMouseUp(CellContext sender, System.Windows.Forms.MouseEventArgs e) { foreach (IController controller in m_ControllerList) controller.OnMouseUp(sender, e); } Controllers.Grid.Default 中指定了对所有键盘和鼠标事件的处理:( += 是什么意思?) protected override void OnAttach(GridVirtual grid) { grid.MouseDown += new GridMouseEventHandler(grid_MouseDown); grid.MouseUp += new GridMouseEventHandler(grid_MouseUp); grid.MouseMove += new GridMouseEventHandler(grid_MouseMove); … } 如果用户在某个Cell上操作的话,将控制消息进一步传递给Controller,以grid_MouseUp为例。 protected virtual void grid_MouseUp(GridVirtual sender, System.Windows.Forms.MouseEventArgs e) { if (sender.MouseDownPosition.IsEmpty() == false) { Cells.ICellVirtual l_MouseDownCell = sender.GetCell(sender.MouseDownPosition); if (l_MouseDownCell!=null) sender.Controller.OnMouseUp(new CellContext(sender, sender.MouseDownPosition, l_MouseDownCell), e ); sender.ChangeMouseDownCell(Position.Empty, sender.PositionAtPoint(new Point(e.X, e.Y))); } } 因为在GridVirtul 的构造函数中通过m_Controller.AddController( Cells.Controllers.Cell.Default); 注册了默认的Cell控制器,所以最终会执行到Cells.Controllers.Cell中相应的OnMouseUp函数: public override void OnMouseUp(CellContext sender, MouseEventArgs e) { base.OnMouseUp (sender, e); if (sender.Cell != null && sender.Cell.Controller != null) sender.Cell.Controller.OnMouseUp(sender, e); } 这里Sender是一个CellContext 对象,他包含Cell的位置,对应的Cell和Grid等信息: public Position Position; public Cells.ICellVirtual Cell; public GridVirtual Grid; CellVirtual的Controller与GridVirtual中的Controller 一样是一个 Controllers.ControllerContainer对象,在接到控制消息后,会转发给所有注册的控制器。 具体的由CellVirtual派生的类在构造的时候如果需要的话会注册相应的控制器,从而实现对用户交互的处理,以CheckBox为例: public CheckBox() { … AddController(Controllers.CheckBox.Default); AddController(Controllers.MouseInvalidate.Default); … }