2011-02-28 4 views
4

"저장"버튼이 있으므로 사용자가 클릭하면 XML 파일 저장 (XML 직렬화)이 수행됩니다. 여기서 savefiledialog가 사용되며 파일을 선택하지 않고 취소를 누르면 "인수 예외"가 발생하고 "빈 경로 이름이 유효하지 않습니다"라고 표시됩니다. 어떻게이 예외를 처리합니까? 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()'를 쓰면 쓸 수 있습니다. – Oliver

+0

@Oliver - 동의합니다. OP 코드에 많은 변경을 가하지 않기 위해 코드를 작성했지만, 메소드의 시작 부분에있는 SaveFileDialog를 사용하면 갈 수 있습니다. –

+0

wpf를 사용하고 있는데 "DialogResult.OK"에 문제가있는 것 같습니다.이 오류가 발생합니다. 'System.Nullable '에는 'OK'에 대한 정의가없고 첫 번째 인수를 허용하는 'OK'확장 메서드가 없습니다. 'System.Nullable '타입을 찾을 수 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) – jeremychan

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

+0

@jeremychan : 나는 wpf 태그와 Øyvind의 대답에 대한 귀하의 의견에 속았을 것입니다. winforms 대화 상자는'DialogResult'를 반환하고, wpf 카운터 파트는'Nullable '을 반환합니다. –

관련 문제