2009-10-21 13 views
9

Próbuję wprowadzić SaveFileDialog i FileOpenDialog wymuszenie rozszerzenia na nazwę pliku wprowadzoną przez użytkownika. Próbowałem przy użyciu próbki proponowanego w question 389070 ale to nie działa zgodnie z przeznaczeniem:System.Windows.Forms.SaveFileDialog nie wymusza domyślnego rozszerzenia

var dialog = new SaveFileDialog()) 

dialog.AddExtension = true; 
dialog.DefaultExt = "foo"; 
dialog.Filter = "Foo Document (*.foo)|*.foo"; 

if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    ... 
} 

Jeśli użytkownik wpisze tekst test w folderze, w którym plik test.xml dzieje istnieć, okno zasugeruje nazwę test.xml (podczas gdy ja naprawdę chcę tylko zobaczyć *.foo na liście). Co gorsza: jeśli użytkownik wybierze test.xml, to rzeczywiście otrzymam test.xml jako nazwę pliku wyjściowego.

Jak mogę się upewnić, że SaveFileDialog naprawdę pozwala użytkownikowi tylko wybrać plik *.foo? Lub przynajmniej, że zastępuje/dodaje rozszerzenie, gdy użytkownik kliknie Save?

Proponowane rozwiązania (implementowanie obsługi zdarzeń FileOk) wykonują tylko część zadania, ponieważ naprawdę chciałbym wyłączyć przycisk Save, jeśli nazwa pliku zawiera nieprawidłowe rozszerzenie.

Aby pozostać w oknie i zaktualizować wyświetlaną nazwę pliku w polu tekstowym w przewodnika FileOk, aby odzwierciedlić nową nazwę pliku z odpowiednim rozszerzeniem, zobacz following related question.

+0

Nie jestem pewien, ale możesz spróbować ustawić multipleDottedExtensions na True, może to zmieni to zachowanie. – Bobby

+0

Nie, to nic nie zmienia; ale dzięki za podpowiedź. –

Odpowiedz

3

AFAIK nie ma niezawodnego sposobu na wymuszenie danego rozszerzenia pliku. Dobrym zwyczajem jest weryfikacja poprawnego rozszerzenia, po zamknięciu okna dialogowego i poinformowaniu użytkownika, że ​​wybrał nieprawidłowy plik, jeśli rozszerzenie nie pasuje.

14

można obsłużyć zdarzenia FileOk i anulować ją, jeśli to nie jest prawidłowe rozszerzenie

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; 
    } 
} 
0

Najbliższy mam na to jest za pomocą zdarzenia FileOk. Na przykład:

dialog.FileOk += openFileDialog1_FileOk; 

private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    if(!dialog.FileName.EndsWith(".foo")) 
    { 
    e.Cancel = true; 
    } 
} 

Zamówienie FileOK Event w witrynie MSDN.

0

wpadłem na ten sam problem, a ja byłem w stanie kontrolować tego, co zostało przedstawione w następujący sposób:

z OpenFileDialog, pierwsza pozycja w łańcuchu filtra był domyślnym

openFileDialog1.Filter = "Program x Files (*.pxf)|*.pxf|txt files (*.txt)|*.txt"; 
openFileDialog1.ShowDialog(); 

z SaveFileDialog, druga pozycja w filtrze był używany jako domyślny:

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(); 

    } 
} 

po wykorzystaniu tych dwóch filtrów z odpowiednimi fileDialogs, oczekiwane res W końcu nastąpiły ulty. Domyślnie, gdy użytkownik wybierze przycisk zapisywania, a pojawi się przycisk zapisywania pliku, wybrany typ pliku jest typem pliku programu X zdefiniowanym w filtrze dla pliku zapisanego pliku. Podobnie wybrany typ pliku dla pliku otwartego jest typem pliku programu X zdefiniowanym w filtrze dla pliku openfileDialog.

Byłoby również dobrze wykonać pewne sprawdzanie danych wejściowych, jak wspomniano powyżej w tym wątku. Chciałem tylko wskazać, że filtry wyglądają inaczej między tymi dwoma oknami dialogowymi, mimo że oba dziedziczą klasę filedialog.

+0

Nie, przepraszam, nie zrozumiałeś w pełni mojego problemu: z przykładowym kodem dla 'SaveFileDialog', nic nie uniemożliwia użytkownikowi wpisania' foo', a Windows sugeruje nazwę pliku 'foo.xml', jeśli jest to plik XML plik o tej nazwie w otwartym folderze. Nie możesz obecnie upewnić się, że wybrana nazwa pliku respektuje wybrane rozszerzenie '* .pfx' (w twoim przypadku). –

+0

Zawsze jest rejestr ... –

-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 
     } 
    } 
+2

Wyłączenie funkcji autouzupełniania jest nieco trudne, prawda? –

Powiązane problemy