C# 如何强制PropertyGrid始终显示下拉按钮?

C# 如何强制PropertyGrid始终显示下拉按钮?,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,对于枚举和其他类型,一旦选中PropertyGrid,它将在右侧显示一个下拉按钮,表示可以单击该按钮进行更改。是否可以强制PropertyGrid始终显示此下拉按钮,就像它们是普通组合框一样 编辑:要澄清,在当前属性下的屏幕截图中,设置为“颜色”。选择了红色,因此您可以看到下拉按钮,但属性当前设置为“颜色”。蓝色不显示,因此您不会看到它。我希望总是看到下拉按钮 我无法解释正在发生的一切,因为我只深入到足以使其适用于一个特定实例,但是 给定类中的属性,您希望显示为下拉列表的属性: private

对于枚举和其他类型,一旦选中PropertyGrid,它将在右侧显示一个下拉按钮,表示可以单击该按钮进行更改。是否可以强制PropertyGrid始终显示此下拉按钮,就像它们是普通组合框一样

编辑:要澄清,在当前属性下的屏幕截图中,设置为“颜色”。选择了红色,因此您可以看到下拉按钮,但属性当前设置为“颜色”。蓝色不显示,因此您不会看到它。我希望总是看到下拉按钮


我无法解释正在发生的一切,因为我只深入到足以使其适用于一个特定实例,但是

给定类中的属性,您希望显示为下拉列表的属性:

private String _groupHeader = null;
[Category("Display")]
[DisplayName("Group Header")]
[Description("Any adjacent columns sharing this text will be displayed together as a merged header.")]
[DefaultValue("")]
[TypeConverter(typeof(GroupHeaderTypeConverter))]
public String GroupHeader { get { return _groupHeader; } set { _groupHeader = value; } }
然后需要一个
StringConverter

public class GroupHeaderTypeConverter : StringConverter
{
    private static List<String> groupHeaderList = new List<String>();
    public override Boolean GetStandardValuesSupported(ITypeDescriptorContext context) { return true; }
    public override Boolean GetStandardValuesExclusive(ITypeDescriptorContext context) { return false; }
    public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { return new StandardValuesCollection(groupHeaderList); }
    public static void SetList(List<String> newList) { groupHeaderList = newList; }
}
公共类GroupHeaderTypeConverter:StringConverter
{
私有静态列表groupHeaderList=新列表();
公共重写布尔GetStandardValuesSupported(ITypeDescriptorContext上下文){return true;}
公共重写布尔GetStandardValuesEnclusive(ITypeDescriptorContext上下文){return false;}
公共重写TypeConverter.StandardValuesCollection GetStandardValues(ITypeScriptorContext上下文){返回新的StandardValuesCollection(groupHeaderList);}
公共静态void SetList(List newList){groupHeaderList=newList;}
}
然后,在代码中的某个时刻,您必须设置列表:

private List<String> _groupHeaders = new List<String>();
//add to _groupHeaders
GroupHeaderTypeConverter.SetList(_groupHeaders);
private List_groupHeaders=new List();
//添加到_groupHeaders
GroupHeaderTypeConverter.SetList(_groupHeaders);
在我的例子中,当我从数据库中提取数据时,我正在加载
\u groupHeaders
列表


恐怕我只能做到这一点了……
TypeDescriptor
并不是我的强项,但我希望这能有所帮助。

经过一些研究,我发现您无法强制propertygrid中的每个属性始终显示下拉按钮。原因是propertygrid仅包含一个下拉按钮。因此,不能同时看到多个下拉按钮。对于枚举之类的属性,一种解决方案是在选择枚举属性时自动单击下拉按钮,这样您就不必选择建筑红线,然后自己单击下拉按钮(这样可以保存一次单击!:)。下面是一个示例代码:

void propertyGrid1_SelectedGridItemChanged(object sender, SelectedGridItemChangedEventArgs e)
    {
        if (e.NewSelection != null &&
            e.NewSelection.PropertyDescriptor != null &&
            e.NewSelection.PropertyDescriptor.Converter != null &&
            e.NewSelection.PropertyDescriptor.Converter.GetStandardValuesExclusive() == true)
        {
            System.Reflection.FieldInfo field_gridView = propertyGrid1.GetType().GetField("gridView", System.Reflection.BindingFlags.NonPublic
                | System.Reflection.BindingFlags.Instance);

            object gridView = field_gridView.GetValue(propertyGrid1);                

            System.Reflection.MethodInfo gridView_methode_get_DropDownButton = gridView.GetType().GetMethod("get_DropDownButton", System.Reflection.BindingFlags.NonPublic
                | System.Reflection.BindingFlags.Instance);

            object dropdownbutton = gridView_methode_get_DropDownButton.Invoke(gridView, new object[0]);

            System.Reflection.MethodInfo dropdownbutton_method_OnClick = dropdownbutton.GetType().GetMethod("OnClick", System.Reflection.BindingFlags.NonPublic
                | System.Reflection.BindingFlags.Instance);

            dropdownbutton_method_OnClick.Invoke(dropdownbutton, new object[] { new System.EventArgs() });
        }
    }
希望能有帮助。
Anben

可能是@LarsTech的复制品我不认为这是同一个问题。我想你打算在某个时候强制向它提供物品?你的要求是可能的,但困难和混乱。调查和相关的课程。如果不是同一个问题,那么我认为这是不可能的。