转载请注明出处: 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的功能。

==================================================================
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);
…
}