C# 排除OpenFileDialog中显示的特定文件
我正在使用Microsoft.win32.OpenFileDialog打开SQLCE数据库文件(.sdf)。我添加了以下过滤器*.sdf,因此它只显示.sdf文件,但我还要求它从对话窗口中删除特定的.sdf文件。我要删除的数据库的名称是固定的,但我无法控制其他数据库的名称,因为它们是通过应用程序创建的,用户通过应用程序决定它们的名称 我想要实现的一个例子是,假设我有以下数据库 数据库1.sdf 数据库2.sdf 数据库3.sdf 我想得到除database2.sdf之外的所有数据C# 排除OpenFileDialog中显示的特定文件,c#,.net,wpf,openfiledialog,C#,.net,Wpf,Openfiledialog,我正在使用Microsoft.win32.OpenFileDialog打开SQLCE数据库文件(.sdf)。我添加了以下过滤器*.sdf,因此它只显示.sdf文件,但我还要求它从对话窗口中删除特定的.sdf文件。我要删除的数据库的名称是固定的,但我无法控制其他数据库的名称,因为它们是通过应用程序创建的,用户通过应用程序决定它们的名称 我想要实现的一个例子是,假设我有以下数据库 数据库1.sdf 数据库2.sdf 数据库3.sdf 我想得到除database2.sdf之外的所有数据 您将遇到的一个
您将遇到的一个问题是,即使文件可以隐藏在文件浏览器中,用户仍然可以在对话框的文本部分键入文件名。该文件确实存在,因此就对话框而言,它将是一个有效的选择,并且该行为将很难覆盖
您不能轻松地强制对话框不选择确实存在的文件,但可以轻松地验证对话框返回的数据。我建议您在对话框关闭后验证文件名,并做出适当的反应。您将遇到的一个问题是,即使文件可以隐藏在文件浏览器中,用户仍可以在对话框的文本部分键入文件名。该文件确实存在,因此就对话框而言,它将是一个有效的选择,并且该行为将很难覆盖
您不能轻松地强制对话框不选择确实存在的文件,但可以轻松地验证对话框返回的数据。我建议您在对话框关闭后验证文件名,并做出适当的反应。OFD很棘手。它是一个通用文件选择器,旨在“尽可能地帮助”文件。过滤器只是用户的小帮手。它们不会阻止拾取其他文件 运行画笔或应用程序,打开文件选择器。在“文件类型”组合框中,您可能会看到一些过滤器,实际上,对话框将仅显示该文件。输入“*”作为文件名,然后按OK/Enter。几乎可以肯定,现在将看到所有文件,而不考虑过滤器 这种行为适合你使用吗?如果你想在对话框中隐藏一些文件,我想不是。如果我是对的,那么OFD根本不适合您,您应该编写自己的简单“SDF数据库选择器”,构建在ListView/etc上,它只列出您想要显示的内容 否则,如果这是确定的,那么您可以将句柄(在.Net中,它们作为
IntPtr
传递)获取到窗口,然后检查窗口结构以在其上找到(IIRC)SysListView控件,然后与它对话以删除不需要的元素。所有的工作将通过C++或P/Unjk来完成。如果你真的需要的话,我会设法找到一些链接。给我写张便条
--首先,很抱歉输入错误的组件名称。窗口类别为
SysListView32
首先,浏览一些文章。请小心,因为其中大多数引用的是System.Windows.Forms,而不是WPF。大多数信息都是正确的和相关的,因为在内部,它仍然是相同的组件,jsut的包装有点不同
- 以及“如何完成”一节-他们会给你一些关于要做什么和如何做的概述。重点是拦截句柄和
utility类的操作NativeWindow
- ,我打赌你可以从中借用很多有用的样板代码。但是,没有一篇文章提到修改项目列表
- 在这里,这个家伙给出了一段代码,找到了名为“SHELLDLL_DefView”的子窗口——这是我们想要“破解”的syslistview
HWND
就是您刚刚找到的句柄(IntPtr)(HWND=[H]和le to-[W]i[ND]ow)
名为“ListView”的控件可以理解大量不同的消息。控件是一个窗口,因此它可以理解WM_xxxx消息([W]indow[M]essage_xxx)。而且还了解blahblahblah,更重要的是,它还以LVM_xxxx消息的形式定义了自己的API([L]ist[V]iew[M]essage_xxxx),例如。请注意,在LVM_GETITEM页面上有一个巨大的LVM_xxx消息列表:GETITEMCOUNT、INSERTITEM、DELETEITEM等。LVM_DELETEITEM是实现目标的关键之一。下面介绍如何删除“第三行中的项目”。行,因为ListView的自然视图基于栅格/行。类似桌面的显示模式是一种附加模式,在逻辑上,每个项目仍然被认为是在连续的行中,而不是在X-Y网格单元上。好的,好的,除了桌面和自由形式图标的放置,这也是由SysListView32完成的,但这是另一个故事
下面是一组关于ListView的文章:
请注意,您必须将所有内容转换为C#和P/Invoke
本机控件名为ListView,实际上,[System.Windows.Forms.ListView]是它的.Net包装器!但是,没有什么好方法可以将该类的实例绑定到预先存在的本机组件实例。该类旨在从头创建新的本机ListView组件。如果你有谷歌搜索的技能或运气,你可以尝试将这样的ListView绑定到本地ListView,然后跳过som