SourceGrid 阅读笔记(1)

    技术2022-05-11  76

    转载请注明出处: 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);          … }     

    最新回复(0)