c#-在UserControl中公开DataGridView的Columns属性,并使其可以通过Designer编辑
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-在UserControl中公开DataGridView的Columns属性,并使其可以通过Designer编辑,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3471字,纯文字阅读大概需要5分钟。
内容图文
![c#-在UserControl中公开DataGridView的Columns属性,并使其可以通过Designer编辑](/upload/InfoBanner/zyjiaocheng/665/fd2643b49e0143c39dc6c3d1a01e7eef.jpg)
Short description:
I have a UserControl with a DataGridView on it. I
want to expose the DataGridView Columns collection to the designer, so
I can change the columns on my User Control at design time.
问:为此,我需要哪些设计师属性?
对于那些对较长版本感兴趣的人:
我有一个具有以下功能的UserControl:
> DataGridView,显示集合中项目的“页面”.
> NumericUpdown控件以选择要显示的页面.
>显示上一页/下一页时将禁用的上一页/下一页按钮
>对显示项目的更改以视觉方式标记
>用于保存/放弃更改的按钮.
该用户控件可以自主运行.它具有父控件要使用的一个功能:
>显示页面(要显示的项目集合)
UserControl引发两个事件:
>事件页面已更改(带有页码).应该导致加载新页面
>事件保存项(包含更改项的集合)
我必须以几种形式显示此用户控件.唯一的区别是每个表格的DataGridViewColumn集合不同.
我可以以编程方式添加列,但是使用设计器创建列会更容易.
解决方法:
通常,使用Editor属性注册一个合适的UITypeEditor就足够了. DataGridView使用的编辑器是DataGridViewColumnCollectionEditor.但是在这种情况下,如果我们直接使用此编辑器,则编辑器期望该属性属于DataGridView并尝试将ITypeDescriptorContext.Instance的值转换为DataGridVeiew,并且由于我们的Columns属性属于我们的用户控件,因此我们将收到异常:
Unable to cast object of type ‘
Type of Control'
to type
‘System.Windows.Forms.DataGridView
‘.
为了解决该问题,我们需要创建一个自定义UITypeEditor并覆盖EditValue并编辑用户控件的私有DataGridView字段的Columns属性.
为此,我们创建一个ITypeDescriptorContext实例,该实例包含DataGridView及其Columns属性,并将其传递给编辑器的EditValue方法.这样,编辑器将编辑我们的Columns属性.
我们还使用[DesignerSerializationVisibility]属性装饰属性,以序列化集合内容.
这是实现.
MyUserControl
我想您在设计时向用户控件添加了DataGridView,其名称为dataGridView1.
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
[Editor(typeof(MyColumnEditor), typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public DataGridViewColumnCollection Columns
{
get { return this.dataGridView1.Columns; }
}
}
编辑
public class MyColumnEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
var field = context.Instance.GetType().GetField("dataGridView1",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
var dataGridView1 = (DataGridView)field.GetValue(context.Instance);
dataGridView1.Site = ((Control)context.Instance).Site;
var columnsProperty = TypeDescriptor.GetProperties(dataGridView1)["Columns"];
var tdc = new TypeDescriptionContext(dataGridView1, columnsProperty);
var editor = (UITypeEditor)columnsProperty.GetEditor(typeof(UITypeEditor));
var result = editor.EditValue(tdc, provider, value);
dataGridView1.Site = null;
return result;
}
}
ITypeDescriptionContext实现
public class TypeDescriptionContext : ITypeDescriptorContext
{
private Control editingObject;
private PropertyDescriptor editingProperty;
public TypeDescriptionContext(Control obj, PropertyDescriptor property)
{
editingObject = obj;
editingProperty = property;
}
public IContainer Container
{
get { return editingObject.Container; }
}
public object Instance
{
get { return editingObject; }
}
public void OnComponentChanged()
{
}
public bool OnComponentChanging()
{
return true;
}
public PropertyDescriptor PropertyDescriptor
{
get { return editingProperty; }
}
public object GetService(Type serviceType)
{
return editingObject.Site.GetService(serviceType);
}
}
内容总结
以上是互联网集市为您收集整理的c#-在UserControl中公开DataGridView的Columns属性,并使其可以通过Designer编辑全部内容,希望文章能够帮你解决c#-在UserControl中公开DataGridView的Columns属性,并使其可以通过Designer编辑所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。