.NET组件控件实例编程系列——3.DataGridView列标题可编辑组件2011-10-15 博客园 Alex Leo在上一篇中介绍了用Label控件模拟网页链接的组件,实现原理只是简单的将Label控件的事件进行了 处理。本篇中介绍的DataGridView列标题可编辑组件在对DataGridView控件的事件进行处理的同时,加入 了更多的技巧。首先介绍本示例要实现的效果。WinForm中的DataGridView控件只能对单元格进行编辑,但有时候需要 对列标题进行编辑,即自定义列标题。本组件就是实现列标题编辑的功能,双击列标题即可进行编辑,支 持键盘左右键移动编辑单元格。编辑效果如下图。(注:双击列标题对某些数据源会执行排序操作,如果 需要避免,可以自行修改为通过右键菜单选择开始编辑。)

上面介绍了需要实现什么效果,但DataGridView的列标题是不提供编辑的,那如何实现编辑呢?这里 用了一个RichTextBox控件去模拟编辑状态,将RichTextBox控件覆盖到需要编辑的列标题上方,看起来就 像是对列标题进行编辑一样。这个例子就比上一个稍微复杂一点,不仅仅是处理几个简单的事件了。下面 就介绍实现的过程。首先新建一个项目,选择项目类型为类库,输入项目名称DataGridViewColumnHeaderEditor,然后添 加组件DataGridViewColumnHeaderEditor。具体的操作步骤在上一篇已经介绍过了,就不详细阐述。和上一篇中介绍的组件一样,首先必须给组件指定一个操作目标。这里要操作的是DataGridView,所 以添加一个DataGridView类型的属性,另外添加了一个属性指示是否允许编辑,代码如下:上面提到了用 一个RichTextBox控件去模拟编辑效果,那么这里就需要添加一个RichTextBox控件。切换到组件的设计视 图,从工具箱中拖动一个RichTextBox控件到组件中。设置RichTextBox控件的相关属性,将MultiLine、 TabStop和Visible均设置为False。启用编辑的操作是双击列标题,那么就需要对DataGridView控件的列标题双击事件进行处理。上一篇 中介绍了窗体背后的故事,是通过设置属性的时候绑定事件处理程序的,也提到了用另一种方法实现,那 就是ISupportInitialize接口。本例就采用这种方法来把控件的事件和对应的事件处理程序绑定。
private DataGridView m_TargetControl = null;
/// <summary>
/// 要编辑的目标 DataGridView 控件
/// </summary>
[Description("要编辑的目标 DataGridView 控件。")]
public DataGridView TargetControl
{
get { return m_TargetControl; }
set { m_TargetControl = value; }
}
private bool m_EnableEdit = true;
/// <summary>
/// 是否允许编辑
/// </summary>
[Description("是否允许编辑。"), DefaultValue(true)]
public bool EnableEdit
{
get { return m_EnableEdit; }
set { m_EnableEdit = value; }
}