2009-10-21 26 views
9

Tôi đang cố gắng thực hiện SaveFileDialogFileOpenDialog thi hành phần mở rộng cho tên tệp được người dùng nhập. Tôi đã thử bằng cách sử dụng mẫu đề xuất trong question 389070 nhưng nó không hoạt động như mong đợi:System.Windows.Forms.SaveFileDialog không thực thi phần mở rộng mặc định

var dialog = new SaveFileDialog()) 

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

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

Nếu sử dụng các loại văn bản test trong một thư mục, nơi một tập tin test.xml xảy ra để tồn tại, hộp thoại sẽ gợi ý tên test.xml (trong khi tôi thực sự chỉ muốn xem *.foo trong danh sách). Tồi tệ hơn: nếu người dùng chọn test.xml, thì tôi thực sự sẽ nhận được test.xml làm tên tệp đầu ra.

Làm cách nào để đảm bảo rằng SaveFileDialog thực sự chỉ cho phép người dùng chọn tệp *.foo? Hoặc ít nhất, nó thay thế/thêm phần mở rộng khi người dùng nhấp vào Save?

Các giải pháp được đề xuất (thực hiện xử lý sự kiện FileOk) chỉ thực hiện một phần công việc, vì tôi thực sự muốn vô hiệu hóa nút Save nếu tên tệp có phần mở rộng sai.

Để ở lại trong hộp thoại cập nhật tên tập tin được hiển thị trong hộp văn bản trong xử lý FileOk, để phản ánh tên tập tin mới với phần mở rộng đúng, xem following related question.

+0

Tôi không chắc chắn, nhưng bạn có thể thử đặt multipleDottedExtensions thành True, có thể điều này sẽ thay đổi hành vi đó. – Bobby

+0

Không, điều này không thay đổi gì cả; nhưng cảm ơn cho gợi ý. –

Trả lời

3

AFAIK không có cách nào đáng tin cậy để thực thi một phần mở rộng tệp đã cho. Nó là một thực hành tốt anyway để xác minh phần mở rộng chính xác, một khi hộp thoại được đóng lại và thông báo cho người dùng rằng ông đã chọn một tập tin không hợp lệ nếu phần mở rộng không phù hợp.

14

Bạn có thể xử lý các sự kiện FileOk, và hủy bỏ nó nếu nó không phải là phần mở rộng đúng

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

gần nhất tôi đã có vấn đề này là bằng cách sử dụng sự kiện FileOk. Ví dụ:

dialog.FileOk += openFileDialog1_FileOk; 

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

Thanh toán FileOK Event trên MSDN.

0

Tôi chạy vào vấn đề này giống nhau, và tôi đã có thể kiểm soát những gì được hiển thị bằng cách làm như sau:

với OpenFileDialog, mục đầu tiên trong chuỗi lọc là mặc định

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

với SaveFileDialog, mục thứ hai trong bộ lọc được sử dụng như mặc định:

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

    } 
} 

Sau khi sử dụng hai bộ lọc này với fileDialogs tương ứng, The res dự kiến ults cuối cùng đã xảy ra. Theo mặc định, khi người dùng chọn nút lưu và savefiledialog xuất hiện, loại tệp được chọn là loại tệp Chương trình X được xác định trong bộ lọc cho savefiledialog. Tương tự như vậy, filetype được chọn cho openfiledialog là kiểu tệp chương trình X được định nghĩa trong bộ lọc cho openfileDialog.

Cũng nên làm một số xác thực đầu vào như đã đề cập ở trên trong chuỗi này. Tôi chỉ muốn chỉ ra rằng các bộ lọc dường như khác nhau giữa hai hộp thoại mặc dù cả hai đều thừa hưởng lớp đệ quy.

+0

Không, xin lỗi, bạn đã không hiểu đúng vấn đề của tôi: với mã ví dụ của bạn cho 'SaveFileDialog', không có gì ngăn người dùng gõ' foo' và Windows đề xuất tên tệp 'foo.xml' nếu có một XML tệp có tên đó trong thư mục đang mở. Bạn không thể, hiện tại, hãy đảm bảo rằng tên tệp được chọn tôn trọng phần mở rộng '* .pfx' đã chọn (trong trường hợp của bạn). –

+0

Luôn có đăng ký ... –

-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

Tắt tính năng tự động hoàn tất hơi khắc nghiệt, phải không? –

Các vấn đề liên quan