Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排除OpenFileDialog中显示的特定文件_C#_.net_Wpf_Openfiledialog - Fatal编程技术网

C# 排除OpenFileDialog中显示的特定文件

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之外的所有数据 您将遇到的一个

我正在使用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的包装有点不同

  • 以及“如何完成”一节-他们会给你一些关于要做什么和如何做的概述。重点是拦截句柄和
    NativeWindow
    utility类的操作
  • ,我打赌你可以从中借用很多有用的样板代码。但是,没有一篇文章提到修改项目列表
  • 在这里,这个家伙给出了一段代码,找到了名为“SHELLDLL_DefView”的子窗口——这是我们想要“破解”的syslistview
一旦成功拦截打开窗口的操作,并获得SHELLDLL_deView/SysListView32控件的句柄(IntPtr),就可以开始真正的游戏了

该控件尽管名为“SysListView32”,但实际上名为“ListView”,它来自于comctl32.dll,几乎与windows本身一样古老。通过向控件发送“原始winapi消息”,可以很容易地动态地重新配置控件,但糟糕的是,在.Net中没有很好的方法来实现。您也必须P/Invoke才能阅读关于该函数的内容。它的第一个参数,
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