2013-02-28 177 views
1

我有一个Windows Form应用程序,我使用允许用户选择并保存图像的自定义控件。不过,我需要插入一些限制。简单的选择只有jpg文件,但现在我需要限制用户能够看到并选择名称中只有某种模式的jpg图像,并且如果可能的话(我认为我已经在其他Windows应用程序中看到了这一点)我希望此模式保持在File Name字段中,并且用户无法删除它。设置OpenFileDialog限制

我做了什么至今:

我已经限制设置:

fileNameFilter = "All files (*.jpg)|" + ImageNameFilter + "*.jpg"; 
    openFileDialog1.Filter = fileNameFilter; 

我可以告诉他需要寻找什么模式的用户:

openFileDialog1.FileName = fileNameFilter; 

然而,有是我仍然无法完成的两件事。这里是一个打印屏幕要清楚:

enter image description here

首先 - 图案显示,但我可以删除它时,它是由这样的,我想,如果有可能的File name场是Read only或其他用户不应该能够删除我放在那里的东西。

第二 - 这是以前打开过的文件的列表,即使该文件与名称限制/过滤器不匹配,用户仍然可以从列表中选择并保存该文件。我需要,如果可能的话,也可以在打开File Dialog时清除此列表,或者以某种方式阻止用户保存此文件,但我认为第二个将需要太多的额外业务逻辑,因此我宁愿只清理该列表。

回答

2

试图通过过滤器或文件名模式严格控制文件对话框中显示的内容不会起作用。用户可以随时在文件名编辑框中输入自己的模式。

您需要做的是使用文件对话框的设施来控制显示的对象。不幸的是,C#包装器没有公开底层Win32控件提供的这个功能。

如果您需要支持XP,那么您需要监听CDN_INCLUDEITEM通知。这是为文件夹中的每个项目发送的。因此,您有机会允许或拒绝列入每个项目。

对于在Vista和更高版本中使用的对话框,它是不同的。这些对话框使用IFileDialog。您需要调用SetFilter方法来添加过滤器。该过滤器是您执行的IShellItemFilter,它再次使用IncludeItem方法控制包含。

使所有这些事情都发生在C#上会有点麻烦,但这是正确的方式来做你所要求的。一旦你这样做了,就没有必要考虑试图使文件名编辑框为只读。因为对话框只会提供您允许包含的项目。

+0

说实话,你写的东西超过了我目前的水平。我可以尝试一些,但是很有可能失败。你提到过,如果我成功地做了你所提出的建议,那么就不需要尝试使'文件名编辑框'成为只读。但是有没有办法做到这一点,因为在我看来,这是更简单的解决方案? – Leron 2013-02-28 12:50:40

+0

它实际上很容易使用IFileDialog – 2013-02-28 19:42:31

1

No

两种解决方案:在Open-click(您应该这样做)后检查文件名,或者创建自己的控件,显示与您的文件名模式匹配的文件。