2011-02-28 156 views
4

我有一個「保存」按鈕,所以當用戶點擊時,它會做一個xml文件保存(xml序列化)。這裏使用了savefiledialog,當我按下cancel而沒有選擇任何文件時會出現「參數異常」,並說「空路徑名稱不合法」。我如何處理這個異常?即使沒有在savefiledialog中選擇任何路徑,我也希望表單保持不變。非常感謝。空路徑名稱不合法

我savefiledialog片段:

private void SaveButton_Click(object sender, RoutedEventArgs e) 
{ 
     string savepath; 
     SaveFileDialog DialogSave = new SaveFileDialog(); 
     // Default file extension 
     DialogSave.DefaultExt = "txt"; 
     // Available file extensions 
     DialogSave.Filter = "XML file (*.xml)|*.xml|All files (*.*)|*.*"; 
     // Adds a extension if the user does not 
     DialogSave.AddExtension = true; 
     // Restores the selected directory, next time 
     DialogSave.RestoreDirectory = true; 
     // Dialog title 
     DialogSave.Title = "Where do you want to save the file?"; 
     // Startup directory 
     DialogSave.InitialDirectory = @"C:/"; 
     DialogSave.ShowDialog(); 
     savepath = DialogSave.FileName; 
     DialogSave.Dispose(); 
     DialogSave = null; 
     ... 
     using (Stream savestream = new FileStream(savepath, FileMode.Create)) 
     { 
       XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
       serializer.Serialize(savestream, formsaving); 
     } 

} 

發生在這條線我的參數異常:

using (Stream savestream = new FileStream(savepath, FileMode.Create)) 
{ 
     XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
     serializer.Serialize(savestream, formsaving); 
} 

回答

5

這裏的問題是,你不關心保存對話框的結果,並試圖保存,即使用戶點擊取消。你應該改變的代碼是這個樣子,而不是:

... 
DialogSave.InitialDirectory = @"C:/"; 
if(DialogSave.ShowDialog() == DialogResult.OK) 
{ 
    savepath = DialogSave.FileName; 
    DialogSave = null; 
    ... 
    using (Stream savestream = new FileStream(savepath, FileMode.Create)) 
    { 
    XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
    serializer.Serialize(savestream, formsaving); 
    } 
} 
DialogSave.Dispose(); 
+1

而不是調用'DialogSave.Dispose()'我會把它放入'using()'語句 – Oliver 2011-02-28 08:33:14

+0

@Oliver - 我同意你的意見。我編寫了我的代碼,以不對OP代碼作出太多更改,但是在方法開始時使用SaveFileDialog就是要走的路。 – 2011-02-28 08:34:51

+0

我正在使用wpf,並且似乎存在與「DialogResult.OK」的問題,我收到此錯誤:'System.Nullable '不包含'OK'的定義,也沒有接受第一個參數的擴展方法'OK'的類型'System.Nullable '可以找到(你是否缺少使用指令或程序集引用?) – jeremychan 2011-02-28 08:39:06

4

你可能不希望保存,如果用戶取消對話框?從ShowDialog檢查結果,並採取相應的行動:

if (DialogSave.ShowDialog() == true) 
{ 
    savepath = DialogSave.FileName; 
      ... 
    using (Stream savestream = new FileStream(savepath, FileMode.Create)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(FormSaving)); 
     serializer.Serialize(savestream, formsaving); 
    } 
} 
+0

嗨弗雷德裏克·我在得到這個錯誤的'如果(DialogSave.ShowDialog()==真)'操作「==」不能應用於操作數鍵入'System.Windows.Forms.DialogResult'和'bool' – jeremychan 2011-03-01 02:05:30

+0

@jeremychan:我想我被wpf標籤和你對於Øyvind的回答的評論所愚弄了。 winforms對話框返回一個'DialogResult',wpf對應返回'Nullable '。 – 2011-03-01 06:04:39