【问题标题】:Multi-line string in a PropertyGridPropertyGrid 中的多行字符串
【发布时间】:2010-09-12 21:39:31
【问题描述】:

PropertyGrid 中是否有用于多行字符串的内置编辑器。

【问题讨论】:

    标签: c# .net winforms propertygrid


    【解决方案1】:

    我发现System.Design.dllSystem.ComponentModel.Design.MultilineStringEditor,可以这样使用:

    public class Stuff
    {
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
        public string MultiLineProperty { get; set; }
    }
    

    【讨论】:

    • msdn.microsoft.com/en-us/library/… 表示在2.0、3.0、3.5中。
    • 这个怎么用?我正在尝试编写 [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))] [CategoryAttribute("Misc"), Description("All http headers for this mail."), DisplayName("HTTP Headers")] 公共字符串HttpHeaders { 获取 { 返回 mail.HttpHeaders; } } 但这不会将 HttpHeaders 显示为多行。
    • 它是一个多行编辑器,所以我认为你只会在编辑时看到不同之处,所以它只适用于具有公共设置器的属性。
    • 谢谢fryguybob!你知道在网格中显示多行字符串的方法吗?不编辑?谢谢!
    • 在.Net Framework 4.6.1的System.Design.dll中找不到MultilineStringEditor。它是被删除了还是我只是瞎了眼?
    【解决方案2】:

    不,您需要创建所谓的模态 UI 类型编辑器。您需要创建一个继承自 UITypeEditor 的类。这基本上是当您单击正在编辑的属性右侧的省略号按钮时显示的表单。

    我发现的唯一缺点是我需要用特定的属性来装饰特定的字符串属性。我不得不这样做已经有一段时间了。我从 Chris Sells 的一本名为“C# 中的 Windows 窗体编程”的书中获得了这些信息

    VisualHint 有一个名为 Smart PropertyGrid.NET 的商业地产网格。

    【讨论】:

      【解决方案3】:

      我们需要编写自定义编辑器来获得属性网格中的多行支持。

      这是从UITypeEditor实现的客户文本编辑器类

      public class MultiLineTextEditor : UITypeEditor
      {
          private IWindowsFormsEditorService _editorService;
      
          public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
          {
              return UITypeEditorEditStyle.DropDown;
          }
      
          public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
          {
              _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
      
              TextBox textEditorBox = new TextBox();
              textEditorBox.Multiline = true;
              textEditorBox.ScrollBars = ScrollBars.Vertical;
              textEditorBox.Width = 250;
              textEditorBox.Height = 150;
              textEditorBox.BorderStyle = BorderStyle.None;
              textEditorBox.AcceptsReturn = true;
              textEditorBox.Text = value as string;
      
              _editorService.DropDownControl(textEditorBox);
      
              return textEditorBox.Text;
          }
      }
      

      编写您的自定义属性网格并将此编辑器属性应用于属性

      class CustomPropertyGrid
      {
          private string multiLineStr = string.Empty;
      
          [Editor(typeof(MultiLineTextEditor), typeof(UITypeEditor))]
          public string MultiLineStr
          {
              get { return multiLineStr; }
              set { multiLineStr = value; }
          }
      }
      

      在主窗体中分配这个对象

       propertyGrid1.SelectedObject = new CustomPropertyGrid();
      

      【讨论】:

        【解决方案4】:

        是的。我不太记得它是如何调用的,但请查看 Items 属性编辑器中的 ComboBox 之类的东西

        已编辑:截至@fryguybob,ComboBox.Items 使用 System.Windows.Forms.Design.ListControlStringCollectionEditor

        【讨论】:

        • ComboBox.Items 使用 System.Windows.Forms.Design.ListControlStringCollectionEditor,我认为这不是我想要的,但它很接近。
        猜你喜欢
        • 1970-01-01
        • 2015-11-07
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 2013-10-23
        相关资源
        最近更新 更多