- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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:
此用户控件可以自主工作。它有一个函数供父控件使用:
UserControl 引发两个事件:
我必须在多个表单上显示此用户控件。唯一的区别是 DataGridViewColumn 的集合因表单而异。
我可以通过编程方式添加列,但使用设计器创建它们会更容易。
最佳答案
通常注册一个合适的UITypeEditor
就足够了使用 [Editor]
属性。 DataGridView
使用的编辑器是 DataGridViewColumnCollectionEditor
。但是在这种情况下,如果我们直接使用这个编辑器,编辑器期望属性属于 DataGridView
并尝试转换 ITypeDescriptorContext.Instance
的值。到 DataGridView
并且由于我们编辑 Columns
属性属于我们的用户控件,我们将收到一个异常:
Unable to cast object of type '
Type of Control'
to type 'System.Windows.Forms.DataGridView
'.
要解决这个问题,我们需要创建一个自定义的UITypeEditor
并覆盖EditValue
并编辑用户控件的私有(private) DataGridView
字段的 Columns
属性。
为此,我们创建了一个 ITypeDescriptorContext
的实例包含 DataGridView
及其 Columns
属性并将其传递给编辑器的 EditValue
方法。这样,编辑器将编辑我们的 Columns
属性。
我们还使用 [DesignerSerializationVisibility]
装饰我们的属性(property)序列化集合内容的属性。
这里是实现。
我的用户控件
我假设您在设计时向用户控件添加了一个 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 进行编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787383/
您好,我的 WPF UserControl 知识只有一个小时了。因此,如果有很多关于这个问题的教程或/和答案,请原谅我(老实说,我认为这无法完成,需要重新编写代码……因此我想问的原因) 因此,在创建
我看过几篇文章介绍如何删除在运行时添加的 UserControl,但我的问题有点不同。我有一个 UserControl,它由一个图像组成,右上角有一个小“x”按钮,用于从其父 Canvas 中删除自身
我有一个用户控件 UserControl1,它在其资源中定义了一种样式。该用户控件包含一个 UserControl2 实例,它引用了该样式:
我正在尝试以 How can a WPF UserControl inherit a WPF UserControl? 中提到的方式继承 WPF 中的用户控件 namespace DMS.Presen
我想创建几个具有一些通用功能的 WPF UserControl 类。出于这个原因,我想从一个新的基类派生类,而这个基类又派生自 UserControl。 我的问题是我的 C# 类是 部分 定义的,而自
这个问题在这里已经有了答案: Should a user control have its own view model? (6 个答案) How to correctly bind to a de
我有一个 UserControl,它包含另一个带有 Button 的 UserControl。我想在第一个 UserControl(父级)中向该按钮添加一个事件。我尝试这样做: void Page_I
我需要我所有的用户控件都具有一些类似的功能。所以我的用户控件是: using System.Windows.Controls; namespace WpfApplication26 { ///
以下 WPF UserControl 调用了 DataTypeWholeNumber,它有效。 现在我想创建一个名为 DataTypeDateTime 和 DataTypeEmail 等的 UserC
我有一个包含按钮和其他一些控件的 UserControl: ... 当我创建该控件的新实例时,我想获取 Button 的 Command 属性: 当然,“Th
我不确定这个问题是否已经发布,并且我已经检查了建议的 SO 链接,但似乎没有一个链接与该问题完全相关。因此,如果有人认为这可能是重复的,请发布建议答案的链接并原谅这篇文章。 解决我的问题的方法可能不止
我在 UserControl_1 中有两个 UserControl,有一个按钮可以在 MainWindow.axml 中的 StackPanel 中添加 UserControl_2。我在 UserCo
我正在开发一个由多个传感器组成的模块化项目,每个传感器都继承自一个抽象的 Sensor 类。为了配置每个传感器,我已经开始为每个传感器添加一个用户控制面板(继承自 UserControl),它在运行时
我正在使用 c#.net 我的网络表单中有不同的 View ,除了三个文本框(到达/看到/离开时间)之外,这些通常都显示不同的信息。为了尝试减少代码,我创建了一个包含这三个文本框的 UserContr
我有一个 UserControl,它有两个组件 public System.Windows.Forms.ComboBox innerComboBox; public System.Windows.Fo
我有一个包含 ListBox 的 userControl。我想从另一个 userControl 访问那个 ListBox。 例如: UserControl1.ListBox1.Items.Count;
我在更新另一个用户控件中的用户控件时遇到问题。 示例代码: UserControl MyCart1 = (UserControl)Page.FindControl("MyCart1"); Update
我在下面添加了一些屏幕截图和重现步骤。 我的数据模型有一个基类,我们称它为 CommonThing,它有很多属性。然后有几个具有附加属性的此类的特殊版本。我现在想创建一个 UI 来将数据输入到这个模型
我有一个应用程序,我需要确保在使用 ShowDialog() 单击用户控件上的按钮打开的表单将在我处理用户控件时关闭和处理。 我通过计时器在主窗体中调用 userControl.Dispose()。
我正在努力实现... 用户控件(MyRepeater) Control Start Control End 页面 Page Start Page Item Tem
我是一名优秀的程序员,十分优秀!