切掉文本并在PropertyGrid of winforms中显示三个点

切掉文本并在PropertyGrid of winforms中显示三个点,winforms,propertygrid,Winforms,Propertygrid,我想剪切额外的文本并显示三个点(…),当用户单击单元格时,所有内容都必须显示出来。如何计算特性网格单元的宽度并剪切文本。任何帮助都将不胜感激 附图片说明 属性网格不允许这样做,您无法使用任何官方方式对其进行自定义 然而,这里有一些似乎有效的示例代码。它使用一个属性来减少网格大小的值 使用风险自负,因为它依赖于PropertyGrid的内部方法,可能会影响性能,因为每次调整大小时都需要刷新整个网格 public partial class Form1 : Form { public F

我想剪切额外的文本并显示三个点(…),当用户单击单元格时,所有内容都必须显示出来。如何计算特性网格单元的宽度并剪切文本。任何帮助都将不胜感激

附图片说明


属性网格不允许这样做,您无法使用任何官方方式对其进行自定义

然而,这里有一些似乎有效的示例代码。它使用一个属性来减少网格大小的值

使用风险自负,因为它依赖于PropertyGrid的内部方法,可能会影响性能,因为每次调整大小时都需要刷新整个网格

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // note this may have an impact on performance
        propertyGrid1.SizeChanged += (sender, e) => propertyGrid1.Refresh();

        var t = new Test();
        t.MyStringProperty = "The quick brown fox jumps over the lazy dog";
        propertyGrid1.SelectedObject = t;
    }

}

public class AutoSizeConverter : TypeConverter
{
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (value == null)
            return null;

        // small trick to get PropertyGrid control (view) from context
        var view = (Control)context.GetService(typeof(IWindowsFormsEditorService));

        // bigger trick (hack) to get value column width & font
        int width = (int)view.GetType().GetMethod("GetValueWidth").Invoke(view, null);
        var font = (Font)view.GetType().GetMethod("GetBoldFont").Invoke(view, null); // or GetBaseFont

        // note: the loop is not super elegant and may probably be improved in terms of performance using some of the other TextRenderer overloads
        string s = value.ToString();
        string ellipsis = s;
        do
        {
            var size = TextRenderer.MeasureText(ellipsis, font);
            if (size.Width < width)
                return ellipsis;

            s = s.Substring(0, s.Length - 1);
            ellipsis = s + "...";
        }
        while (true);
    }
}

public class Test
{
    // we use a custom type converter
    [TypeConverter(typeof(AutoSizeConverter))]
    public string MyStringProperty { get; set; }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
//注意:这可能会对性能产生影响
propertyGrid1.SizeChanged+=(发送方,e)=>propertyGrid1.Refresh();
var t=新测试();
t、 MyStringProperty=“敏捷的棕色狐狸跳过懒惰的狗”;
propertyGrid1.SelectedObject=t;
}
}
公共类AutoSizeConverter:TypeConverter
{
公共重写对象转换为(ITypeDescriptorContext上下文、CultureInfo区域性、对象值、类型destinationType)
{
如果(值==null)
返回null;
//从上下文获取PropertyGrid控件(视图)的小技巧
var view=(Control)context.GetService(typeof(IWindowsFormsEditorService));
//获取值的更大技巧(hack)列宽和字体
int width=(int)view.GetType().GetMethod(“GetValueWidth”).Invoke(view,null);
var font=(font)view.GetType().GetMethod(“GetBoldFont”).Invoke(view,null);//或GetBaseFont
//注意:循环不是非常优雅,使用其他一些TextRenderer重载可能会提高性能
字符串s=value.ToString();
字符串省略号=s;
做
{
var size=TextRenderer.MeasureText(省略号,字体);
if(size.Width
以下是结果(支持调整大小):


您需要找到正确的属性。在屏幕截图中查找控件的源代码,根据需要处理属性,并查看property.Hi上的属性。也可以有ConvertFrom函数吗?用户也想编辑数据您必须重写CanConvertFrom并返回true,但问题是原始字符串被切碎,因此您必须将其存储在对象的另一个属性中,例如Hi Simon,谢谢您的回答。你能帮我一下吗?当用户单击单元格时,应该有3个点,它应该显示整个字符串,用户可以进行更改。当用户离开单元格时,我们将再次切掉更新的字符串,并用三个点显示