2009-10-21 22 views
9

Estoy intentando hacer que SaveFileDialog y FileOpenDialog hagan cumplir una extensión del nombre de archivo ingresado por el usuario. He intentado usar la muestra se propone en question 389070 pero no funciona como se esperaba:System.Windows.Forms.SaveFileDialog no impone la extensión predeterminada

var dialog = new SaveFileDialog()) 

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

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

Si el usuario escribe el texto test en una carpeta en un archivo test.xml pasa de existir, el diálogo sugerirá el nombre test.xml (Mientras que realmente solo quiero ver *.foo en la lista). Peor aún: si el usuario selecciona test.xml, de hecho obtendré test.xml como nombre de archivo de salida.

¿Cómo me puedo asegurar de que SaveFileDialog realmente solo permita al usuario seleccionar un archivo *.foo? ¿O al menos, que reemplaza/agrega la extensión cuando el usuario hace clic en Save?

Las soluciones sugeridas (implementar el controlador de eventos FileOk) solo hacen parte del trabajo, ya que realmente me gustaría deshabilitar el botón Save si el nombre del archivo tiene la extensión incorrecta.

el fin de mantenerse en el diálogo y actualizar el nombre del archivo que se muestra en el cuadro de texto en el controlador FileOk, para reflejar el nuevo nombre del archivo con la extensión correcta, consulte la following related question.

+0

No estoy seguro, pero podría intentar establecer multipleDottedExtensions en True, quizás esto cambie ese comportamiento. – Bobby

+0

No, esto no cambia nada en absoluto; pero gracias por la pista. –

Respuesta

3

AFAIK no hay forma confiable de aplicar una extensión de archivo determinada. De todos modos, es una buena práctica verificar la extensión correcta, una vez que se cierre el cuadro de diálogo e informar al usuario que seleccionó un archivo no válido si la extensión no coincide.

14

Usted puede controlar el evento FileOk, y cancelarla si no es la extensión correcta

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

El más cercano Tengo que esto es mediante el evento FileOk. Por ejemplo:

dialog.FileOk += openFileDialog1_FileOk; 

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

Pedido FileOK Event en MSDN.

0

me encontré con este mismo tema, y ​​yo era capaz de controlar lo que se muestra de la siguiente manera:

con el OpenFileDialog, el primer elemento de la cadena de filtro era el valor por defecto

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

con la SaveFileDialog, el segundo elemento en el filtro se utiliza como el valor por defecto:

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

    } 
} 

Después de haber utilizado estas dos filtros con los respectivos fileDialogs, la res esperados Los resultados finalmente ocurrieron. De forma predeterminada, cuando el usuario selecciona el botón de guardar y se muestra el archivo guardado, el tipo de archivo seleccionado es el del tipo de archivos de programa X definido en el filtro para savefiledialog. Del mismo modo, el tipo de archivo seleccionado para openfiledialog es el tipo de archivos de programa X definido en el filtro para el archivo abiertoDialog.

También sería bueno hacer una validación de entrada como se menciona anteriormente en este hilo. Solo quería señalar que los filtros parecen ser diferentes entre los dos cuadros de diálogo a pesar de que ambos heredan la clase de archivo de diálogo.

+0

No, lo siento, no entendiste correctamente mi problema: con tu código de ejemplo para 'SaveFileDialog', nada impide que el usuario escriba' foo' y que Windows sugiera el nombre de archivo 'foo.xml' si resulta que hay un XML archivo con ese nombre en la carpeta abierta. Actualmente, no puede asegurarse de que el nombre del archivo elegido respeta la extensión '* .pfx' seleccionada (en su caso). –

+0

Siempre está el registro ... –

-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

Desactivar la función de autocompletar es un poco duro, ¿no? –

Cuestiones relacionadas