我正在努力使SaveFileDialog
和FileOpenDialog
强制扩展用户输入的文件名。我已尝试使用question 389070中提出的示例,但它无法按预期工作:
var dialog = new SaveFileDialog())
dialog.AddExtension = true;
dialog.DefaultExt = "foo";
dialog.Filter = "Foo Document (*.foo)|*.foo";
if (dialog.ShowDialog() == DialogResult.OK)
{
...
}
如果用户在文件test
恰好存在的文件夹中键入文本test.xml
,则对话框将建议名称test.xml
(而我真的只想看*.foo
1}}在列表中)。更糟糕的是:如果用户选择test.xml
,那么我的确会得到test.xml
作为输出文件名。
如何确保SaveFileDialog
真的只允许用户选择*.foo
文件?或者至少,当用户点击Save
?
建议的解决方案(实现FileOk
事件处理程序)只执行部分工作,因为如果文件名的扩展名错误,我真的想要禁用Save
按钮。
为了保持对话框和更新FileOk
处理程序中文本框中显示的文件名,以反映具有正确扩展名的新文件名,请参阅{ {3}}
答案 0 :(得分:15)
您可以处理FileOk
事件,如果它不是正确的扩展名,则取消它
private saveFileDialog_FileOk(object sender, CancelEventArgs e)
{
if (!saveFileDialog.FileName.EndsWith(".foo"))
{
MessageBox.Show("Please select a filename with the '.foo' extension");
e.Cancel = true;
}
}
答案 1 :(得分:3)
AFAIK没有可靠的方法来强制执行给定的文件扩展名。无论如何,一旦对话框关闭,验证正确的扩展名是一个好的做法,如果扩展名不匹配,则通知用户他选择了无效的文件。
答案 2 :(得分:0)
我最接近的是使用FileOk事件。例如:
dialog.FileOk += openFileDialog1_FileOk;
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
if(!dialog.FileName.EndsWith(".foo"))
{
e.Cancel = true;
}
}
在MSDN上结帐FileOK Event。
答案 3 :(得分:0)
我遇到了同样的问题,我能够通过执行以下操作来控制显示的内容:
使用OpenFileDialog,过滤字符串中的第一项是默认的
openFileDialog1.Filter = "Program x Files (*.pxf)|*.pxf|txt files (*.txt)|*.txt";
openFileDialog1.ShowDialog();
使用SaveFileDialog,过滤器中的第二项用作默认值:
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "txt files (*.txt)|*.txt|Program x Files (*.pxf)|*.pxf";
saveFileDialog1.FilterIndex = 2;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if (saveFileDialog1.FileName != null)
{
// User has typed in a filename and did not click cancel
saveFile = saveFileDialog1.FileName;
MessageBox.Show(saveFile);
saveCurrentState();
}
}
将这两个过滤器与相应的fileDialogs一起使用后,最终出现了预期的结果。默认情况下,当用户选择保存按钮并显示savefiledialog时,所选的文件类型是savefiledialog过滤器中定义的Program X文件类型。同样,openfiledialog的选定文件类型是openfileDialog过滤器中定义的Program X Files Type的文件类型。
如上所述,在此主题中进行一些输入验证也是一件好事。我只想指出两个对话框之间的过滤器似乎不同,即使它们都继承了filedialog类。
答案 4 :(得分:-1)
//this must be ran as administrator due to the change of a registry key, but it does work...
private void doWork()
{
const string lm = "HKEY_LOCAL_MACHINE";
const string subkey = "\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\AutoComplete";
const string keyName = lm + subkey;
int result = (int)Microsoft.Win32.Registry.GetValue(keyName, "AutoComplete In File Dialog", -1);
MessageBox.Show(result.ToString());
if(result.ToString() == "-1")
{
//-1 means the key does not exist which means we must create one...
Microsoft.Win32.Registry.SetValue(keyName, "AutoComplete In File Dialog", 0);
OpenFileDialog ofd1 = new OpenFileDialog();
ofd1.ShowDialog();
}
if (result == 0)
{
//The Registry value is already Created and set to '0' and we dont need to do anything
}
}