如何最好地公开DataGridView的Columns

九章落地 2008-01-25 11:21:59
之前为了实现DataGridView底部多一行"统计"的功能,我用两个DataGridView组合成一个控件,但新Grid的Columns不是很理想.
我通过继承CollectionEditor,重写了一个新的CollectionEditor:

public class MyUITypeEditor : CollectionEditor
{
public MyUITypeEditor(Type type)
: base(type)
{ }
protected override Type[] CreateNewItemTypes()
{
Type[] types = new Type[] { typeof(DataGridViewTextBoxColumn),
.....
};
return types;
}
}


这样是能实现,但我在设计器里通过Columns属性添加Column时,对话框里不能显示每一列的类型及图标,用户体验比DataGridView自带的DataGridViewColumnCollectionEditor 差很多.

我的Grid继承自Control,如果继承自DataGridView,虽然能调用DataGridView的列设计器,但添加的列并没能添加到Grid的Columns中.

不知有没有什么理想的解决方案?

谢谢!
...全文
422 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
九章落地 2012-01-20
  • 打赏
  • 举报
回复
这样是能实现,但我在设计器里通过Columns属性添加Column时,对话框里不能显示每一列的类型及图标,用户体验比DataGridView自带的DataGridViewColumnCollectionEditor 差很多.

我的Grid继承自Control,如果继承自DataGridView,虽然能调用DataGridView的列设计器,但添加的列并没能添加到Grid的Columns中.

------
店家乐免费服装管理软件|服装销售管理软件|服装进销存软件|服装收银软件|服装店管理软件|免费进销存软件
九章落地 2008-01-25
  • 打赏
  • 举报
回复
TO Hbxtlhx:
您的第一种方法,继承自DataGridView,用它的默认列编辑器,能不能把编辑器产生的列与控件内的
dataGridView1绑定呢?这样好像简单多了

您的第二种方法,由于我对DataGridView的构造不熟,对我而已,自己写一个列编辑器,很有难度!
不知您是否能给一份包含:ColumnCol ,ColumnEditor ,ColumnEditorForm 的代码,让我学习一下:
weidong.huang@vigorcn.com

当然,若您觉得不方便,也没关系 ^_^
北京的雾霾天 2008-01-25
  • 打赏
  • 举报
回复
因为不能直接使用DataGridView的默认的列编辑器,这个被专用了,只能自己定义编辑器。
北京的雾霾天 2008-01-25
  • 打赏
  • 举报
回复
你使用自定义列编辑器吧,按我说的第二种方式来做。
九章落地 2008-01-25
  • 打赏
  • 举报
回复
TO Hbxtlhx:
谢谢!

我现在的Grid继承自Control,若像您上面说的用法,添加列时会出错,提示:CellType属性为空...

如果我改成继承自DataGridView,虽然能用默认的列集合编辑器来编辑列,但添加的列并没有加入到我的Grid里,即像您上面提到的dataGridView1里....
北京的雾霾天 2008-01-25
  • 打赏
  • 举报
回复
或者你可以使用自定义的编辑器来编辑列集合,为你的列集合属性添加类似如下的属性:

[EditorAttribute(typeof(ColumnEditor), typeof(System.Drawing.Design.UITypeEditor))]
public ColumnCol Columns
{
get
{
return this.m_Columns;
}
}

定义ColumnEditor:

internal class ColumnEditor : UITypeEditor
{
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
ColumnEditorForm f = new ColumnEditorForm();
f.ColumnCol = value as ColumnCol;
f.StartPosition = FormStartPosition.CenterParent;
edSvc.ShowDialog(f);
}
return value;
}
public override bool GetPaintValueSupported(System.ComponentModel.ITypeDescriptorContext context)
{
return false;
}
}

ColumnEditorForm为你的列编辑器,可以从Form类直接继承。
zmm123456 2008-01-25
  • 打赏
  • 举报
回复
mark
北京的雾霾天 2008-01-25
  • 打赏
  • 举报
回复
可以在你的Grid里公开DataGridView的列而无需自定义列,比如在Grid里添加如下的属性:

public DataGridViewColumnCollection MyColumns
{
get {
return this.dataGridView1.Columns;
}
}


这样在窗体设计器里选中Grid控件后在属性窗口里可以找到MyColumns属性,并可以使用默认的列集合编辑器来编辑列了。
北京的雾霾天 2008-01-25
  • 打赏
  • 举报
回复
我已发了一个邮件,楼主可以参考一下是否有用。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧