我的用户控件上有下一个属性:
[
Browsable(true),
Category("Data"),
Description("Listado de controles que proporcionan los parámetros para generar el reporte."),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
]
public List<Control> ControlesParametros { set; get; }
我想让Visual Studio向我展示一个编辑器,我可以在我放置用户控件的表单中选择一些现有的控件实例。目前,Visual Studio向我展示了一个编辑器,我可以在其中添加新控件,但不能选择现有控件。
我找到了类似的问题和答案,但解决方案是使用.NET Framework 4.0设计的自定义编辑器,我目前有3.5: Design-time editor support for controls collection
是否有本地编辑器,或者我应该构建一个?
答案 0 :(得分:0)
对于初学者,我会使用Collection<Control>
代替List<T>
。列表通常会起作用,但它会以您可能不需要的方式公开您的收藏。
要获取现有控件,您需要深入了解context.Container.Components
覆盖中的LoadValues
。它将包含所有,包括主机表单本身和组件,因此您可能必须过滤它们。有一点可以肯定的是删除组件(如DataGridViewColumns
和TabPages
),因为它们不会进入List或控件集合;像TableLayoutPanels这样的其他东西你也经常想要删除。
此版本过滤掉默认下拉列表的一些组件和控件:
protected override void LoadValues(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
bool bAdd = true;
Control thisCtl = null;
Collection<Control> tCollection = (Collection<Control>)value;
foreach (object obj in context.Container.Components) {
//Cycle through the components owned by the form in the designer
bAdd = true;
// exclude other components - this weeds out DataGridViewColumns which
// can only be used by a DataGridView
if (obj is Control) {
thisCtl = (Control)obj;
if (ExcludeForm) {
bAdd = !(thisCtl is Form);
}
// custom exclude list
if ((typeExclude != null) && (typeExclude.Count > 0)) {
if (typeExclude.Contains(thisCtl.GetType)) {
bAdd = false;
}
}
bool bCheck = false;
int ndx = 0;
if (bAdd) {
bCheck = tCollection.Contains(thisCtl);
ndx = myCtl.Items.Add(new ListItem(thisCtl));
myCtl.SetItemChecked(ndx, bCheck);
}
}
}
}
如果您愿意,可以显示符合条件的控件对话框样式,并使用CheckedListBox为用户选择控件。有一篇关于CodeProject Selecting Form's Controls at Design Time的文章更详细。
它在VB中,但允许你很容易地轻松实现这样的野兽(我写了,所以我可能有偏见):
ExampleDropDownControlCollectionUIEditor : ControlCollectionDropDownUIEditor
{
public ExampleDropDownControlCollectionUIEditor() : base()
{
base.ExcludeForm = true;
base.CheckControlWidth = 200;
base.typeExclude.Add(typeof(RadioButton));
base.typeExclude.Add(typeof(Label));
}
}
对话框表单很简单,只使用不同的基类ControlCollectionDialogUIEditor