C# 打开OpenFileDialog以更改PropertyGrid控件中属性的值?

C# 打开OpenFileDialog以更改PropertyGrid控件中属性的值?,c#,.net,vb.net,winforms,propertygrid,C#,.net,Vb.net,Winforms,Propertygrid,在Windows窗体中,我在PropertyGid控件中表示一个自定义类,该控件具有各种字符串属性,如下图所示: 问题是我对更改字符串属性值的当前行为并不完全满意。对于那些需要文件或目录路径的属性,如“目标”或“工作目录”属性,我想知道实现一个TypeConverter/类型描述符是否可行,当单击属性网格中字段右侧的向下箭头时,该描述符将打开一个OpenFileDialog。也就是说,通过OpenFileDialog选择一个文件或文件夹,而不是直接在属性网格中写入路径,但如果我想这样做,仍然允

在Windows窗体中,我在
PropertyGid
控件中表示一个自定义类,该控件具有各种字符串属性,如下图所示:

问题是我对更改字符串属性值的当前行为并不完全满意。对于那些需要文件或目录路径的属性,如“目标”或“工作目录”属性,我想知道实现一个TypeConverter/类型描述符是否可行,当单击属性网格中字段右侧的向下箭头时,该描述符将打开一个
OpenFileDialog
。也就是说,通过
OpenFileDialog
选择一个文件或文件夹,而不是直接在属性网格中写入路径,但如果我想这样做,仍然允许选择直接写入路径

可能.NET Framework类库已经提供了我正在请求的TypeConverter/TypeDescriptor?。如果没有,这是否可行?。如何开始这样做


或者任何其他能够打开
OpenFileDialog
以更改
PropertyGrid
控件中特定属性的值的想法?

在我的应用程序中,我有一个属性采用图标文件路径,另一个属性可以采用文件或文件夹,还有其他属性采用文件夹路径

所以,我必须为这些属性中的每一个编写变体

最简单的方法是,如果您对
FolderBrowserDialog
的外观和限制感到满意,则直接在
EditorAttribute
类中指定
System.Windows.Forms.Design.FolderNameEditor
类。除此之外,Ooki.Dialogs是一个很好的开源库,可以替代现代风格的对话框

第二个最简单的是用于选择图标文件路径的编辑器:

“”
''提供用于选择图标文件名的用户界面。
''' 
''' 
友元类IconFileNameEditor:继承FileNameEditor
#地区“建设者”
''' 
''初始化类的新实例。
''' 
公共分新()
MyBase.New()
端接头
#末端区域
#区域“私有方法”
''' 
''在创建“打开文件”对话框时初始化该对话框。
''' 
''' 
''用于选择文件名的。
''' 
受保护的覆盖子初始化对话框(ByVal dlg作为OpenFileDialog)
MyBase.InitializeDialog(dlg)
与dlg
.Multiselect=False
.RestoreDirectory=True
.DereferenceLinks=真
.Filter=“图标文件(*.ico;*.icl;*.exe;*.dll)|*.ico;*.icl;*.exe;*.dll |图标|*.ico |库|*.dll |程序|*.exe”
.FilterIndex=1
.SupportMultiDottedExtensions=True
以
端接头
#末端区域
末级
为了选择一个文件路径或文件夹路径,为了避免在我的项目中添加外部依赖性,为了搜索已经完成的开源内容,我使用了文章中提供的自定义
FileFolderDialog
类,并设法编写了如下编辑器:

“”
''提供用于选择文件或文件夹名称的用户界面。
''' 
''' 
公共类FileOrFolderNameEditor:继承UITypeEditor
#地区“建设者”
''' 
''初始化类的新实例。
''' 
公共分新()
MyBase.New()
端接头
#末端区域
#区域“公共方法”
''' 
''获取该方法使用的编辑器样式。
''' 
''' 
''可用于获取其他上下文信息的。
''' 
''' 
''指示所用编辑器样式的值
用这个方法。
''' 
''如果不支持此方法,
''然后会回来。
''' 
公共重写函数GetEditStyle(ByVal上下文作为ITypeDescriptorContext)作为UITypeEditorEditStyle
返回UITypeEditorEditStyle.Modal
端函数
''' 
''使用方法指示的编辑器样式编辑指定对象的值。
''' 
''' 
''可用于获取其他上下文信息的。
''' 
''' 
''此编辑器可用于获取服务的。
''' 
''' 
''要编辑的对象。
''' 
''' 
''对象的新值。
''' 
''如果对象的值没有更改,则应返回它传递的相同对象。
''' 
Public将函数EditValue(ByVal上下文作为ITypeDescriptorContext,ByVal提供程序作为IServiceProvider,ByVal值作为对象)重写为对象
将dlg用作新的OpenFileOrFolderDialog()
如果(dlg.ShowDialog=DialogResult.OK),则
返回dlg.SelectedPath
如果结束
终端使用
返回MyBase.EditValue(上下文、提供程序、值)
端函数
#末端区域
末级
这非常简单。

有内置的和UI类型的编辑器,可以让您选择文件名和文件夹名,例如:

using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
public class MyClass
{
    [Editor(typeof(FileNameEditor), typeof(UITypeEditor))]
    public string FilePath { get; set; }

    [Editor(typeof(FolderNameEditor), typeof(UITypeEditor))]
    public string FolderPath { get; set; }
}
如果要自定义
filenameditor
以仅显示txt文件,可以覆盖其
InitializeDialog
方法:

public class MyFileNameEditor : FileNameEditor
{
    protected override void InitializeDialog(OpenFileDialog openFileDialog)
    {
        base.InitializeDialog(openFileDialog);
        openFileDialog.Filter = "text files (*.txt)|*.txt";
    }
}

框架对IShellLink一无所知。创建模式UITypeEditor以自定义值编辑。@Hans Passant感谢您的评论。我将从以下代码示例开始练习:docs.microsoft.com/en us/dotnet/api/system.drawing.design.uitypeeditor?view=netframework-4.8,但我要指出的是,这些属性是字符串数据类型的。显然,有一个内置uitypeeditor,其类名为FileNameEditor,可以满足我的需要,或者至少这是这里的建议:。我还没有尝试。该编辑器会打开标准文件选择器对话框(打开文件),并允许您选择文件路径/名称。