在 UserControl 中单击 属性 时错误打开 "Edit Columns"
Error open "Edit Columns" when click property in UserControl
VB.Net
我有一个带 Dgv1(DataGridView) 的用户控件
我想使用 "Edit Columns" 表单编辑设计中的列
代码用户控件:
Public Class MyUserControl
Inherits UserControl
<Editor(GetType(MyColumnEditor), GetType(UITypeEditor))> _
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property Columns() As DataGridViewColumnCollection
Get
Return Me.Dgv1.Columns
End Get
End Property
End Class
我的列编辑器:
Public Class MyColumnEditor
Inherits System.Drawing.Design.UITypeEditor
Public Overrides Function GetEditStyle(context As ITypeDescriptorContext) As UITypeEditorEditStyle
Return UITypeEditorEditStyle.Modal
End Function
Public Overloads Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
Dim field As Object = context.Instance.[GetType]().GetField("Dgv1", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance)
Dim dataGridView1 = CType(field.GetValue(context.Instance), DataGridView)
dataGridView1.Site = CType(context.Instance, Control).Site
Dim columnsProperty As Object = TypeDescriptor.GetProperties(dataGridView1)("Columns")
Dim tdc As Object = New TypeDescriptionContext(dataGridView1, columnsProperty)
Dim editor = CType(columnsProperty.GetEditor(GetType(UITypeEditor)), UITypeEditor)
Dim result As Object = editor.EditValue(tdc, provider, value)
dataGridView1.Site = Nothing
Return result
End Function
End Class
TypeDescriptionContext:
Public Class TypeDescriptionContext
Implements ITypeDescriptorContext
Public editingObject As Control
Public editingProperty As PropertyDescriptor
Public Sub New(obj As Control, property1 As PropertyDescriptor)
editingObject = obj
editingProperty = property1
End Sub
Public ReadOnly Property Container As IContainer Implements ITypeDescriptorContext.Container
Get
Return editingObject.Container
End Get
End Property
Public ReadOnly Property Instance As Object Implements ITypeDescriptorContext.Instance
Get
Return editingObject
End Get
End Property
Public Sub OnComponentChanged() Implements ITypeDescriptorContext.OnComponentChanged
End Sub
Public Function OnComponentChanging() As Boolean Implements ITypeDescriptorContext.OnComponentChanging
Return True
End Function
Public ReadOnly Property PropertyDescriptor As PropertyDescriptor Implements ITypeDescriptorContext.PropertyDescriptor
Get
Return editingProperty
End Get
End Property
Public Function GetService(serviceType As Type) As Object Implements IServiceProvider.GetService
Return editingObject.Site.GetService(serviceType)
End Function
End Class
但是当单击列 属性 进行编辑时显示错误:
未设置对象变量或 With 块变量。
https://i.stack.imgur.com/rkeua.jpg
和
同样的代码在C#:中,运行正常
用户控件:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
[Editor(typeof(MyColumnEditor), typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public DataGridViewColumnCollection Columns
{
get { return this.Dgv1.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("Dgv1",
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;
}
}
TypeDescriptionContext:
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);
}
}
我知道 Vb.net 但不是专业人士
并将此代码 C# 转换为 VB.net
问题出在哪里?
预先感谢您的帮助
我发现了问题
在VB.NetWhen Add Datagridview to UserControl in Designer Cod Is defined has:
Friend WithEvents Dgv1 As System.Windows.Forms.DataGridView
没错
Private Dgv1 As System.Windows.Forms.DataGridView
甚至不应该是那样
Private WithEvents Dgv1 As System.Windows.Forms.DataGridView
太可惜了
我决定转向 C#
VB.Net
我有一个带 Dgv1(DataGridView) 的用户控件
我想使用 "Edit Columns" 表单编辑设计中的列
代码用户控件:
Public Class MyUserControl
Inherits UserControl
<Editor(GetType(MyColumnEditor), GetType(UITypeEditor))> _
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property Columns() As DataGridViewColumnCollection
Get
Return Me.Dgv1.Columns
End Get
End Property
End Class
我的列编辑器:
Public Class MyColumnEditor
Inherits System.Drawing.Design.UITypeEditor
Public Overrides Function GetEditStyle(context As ITypeDescriptorContext) As UITypeEditorEditStyle
Return UITypeEditorEditStyle.Modal
End Function
Public Overloads Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
Dim field As Object = context.Instance.[GetType]().GetField("Dgv1", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance)
Dim dataGridView1 = CType(field.GetValue(context.Instance), DataGridView)
dataGridView1.Site = CType(context.Instance, Control).Site
Dim columnsProperty As Object = TypeDescriptor.GetProperties(dataGridView1)("Columns")
Dim tdc As Object = New TypeDescriptionContext(dataGridView1, columnsProperty)
Dim editor = CType(columnsProperty.GetEditor(GetType(UITypeEditor)), UITypeEditor)
Dim result As Object = editor.EditValue(tdc, provider, value)
dataGridView1.Site = Nothing
Return result
End Function
End Class
TypeDescriptionContext:
Public Class TypeDescriptionContext
Implements ITypeDescriptorContext
Public editingObject As Control
Public editingProperty As PropertyDescriptor
Public Sub New(obj As Control, property1 As PropertyDescriptor)
editingObject = obj
editingProperty = property1
End Sub
Public ReadOnly Property Container As IContainer Implements ITypeDescriptorContext.Container
Get
Return editingObject.Container
End Get
End Property
Public ReadOnly Property Instance As Object Implements ITypeDescriptorContext.Instance
Get
Return editingObject
End Get
End Property
Public Sub OnComponentChanged() Implements ITypeDescriptorContext.OnComponentChanged
End Sub
Public Function OnComponentChanging() As Boolean Implements ITypeDescriptorContext.OnComponentChanging
Return True
End Function
Public ReadOnly Property PropertyDescriptor As PropertyDescriptor Implements ITypeDescriptorContext.PropertyDescriptor
Get
Return editingProperty
End Get
End Property
Public Function GetService(serviceType As Type) As Object Implements IServiceProvider.GetService
Return editingObject.Site.GetService(serviceType)
End Function
End Class
但是当单击列 属性 进行编辑时显示错误: 未设置对象变量或 With 块变量。
https://i.stack.imgur.com/rkeua.jpg
和
同样的代码在C#:中,运行正常
用户控件:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
[Editor(typeof(MyColumnEditor), typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public DataGridViewColumnCollection Columns
{
get { return this.Dgv1.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("Dgv1",
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;
}
}
TypeDescriptionContext:
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);
}
}
我知道 Vb.net 但不是专业人士 并将此代码 C# 转换为 VB.net
问题出在哪里? 预先感谢您的帮助
我发现了问题
在VB.NetWhen Add Datagridview to UserControl in Designer Cod Is defined has:
Friend WithEvents Dgv1 As System.Windows.Forms.DataGridView
没错
Private Dgv1 As System.Windows.Forms.DataGridView
甚至不应该是那样
Private WithEvents Dgv1 As System.Windows.Forms.DataGridView
太可惜了
我决定转向 C#