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