SourceGrid 阅读笔记(1)

本文介绍了一个纯C#编写的网格控件SourceGrid,它具备双列标题、跨行跨列等多种复杂功能,并详细解析了其如何通过Controller机制处理用户交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处: http://blog.youkuaiyun.com/jh_zzz/

从来没有用过C#写过应用程序,甚至根本就懒得学习.Net相关的东西,因为在我的印象中.Net应用程序就是庞大而臃肿,效率低下,但自从最近见到了Paint.Net,DNN,SourceGrid这样一些开源项目,我的看法彻底的发生了改变,强大的语言使我们可以将更多的精力放在代码设计本身上,随着WindowsXP的普及和Vista的到来,必将有更多基于.Net的优秀应用程序诞生。

SourceGrid是一个纯C#语言编写的网格控件,实现了很多难以改决的问题.比如双列标题,跨行,跨列,Combox,Droplist,Button,Linkbutton,Checkbox,下拉,显示图片,排序,数据类型验证等等功能,也具有现有网格的支持数据源的功能,也支持导出csv,html,xml的功能。
 
SourceGrid 
 
==================================================================
 
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);
         …
}
 
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值