2013-06-05 156 views
0

你好,我有我正在使用下面的类来从sql服务器下载Excel文件,在WPF中使用Linq到Sql。我在使用该方法时遇到问题。写入二进制文件到.xlsx

public class Tables 
      { 
       public Guid Id { get; set; } 
       public byte[] Data { get; set; } 
       public string Notes{ get; set; }    
      } 

物业

public ObservableCollection<Tables> Table 
     { 
      get 
      { 
       return mTables; 
      } 
     } 

的方法(错误 - fileBytes没有出现在目前的情况下)

private void executeSaveAttachment(object parameter) 
      { 
       //Enables the apperance of a Dialog, where the user can specify where to save the file 
       SaveFileDialog textDialog = new SaveFileDialog(); 

       //save the file in a bite array 

       // byte[] fileBytes = Table.ToList().ForEach(p => p.Data); 
       Table.ToList().ForEach(p => 
       { 
        byte[] fileBytes = p.Data; 
       }); 

       //Open dialog where the user determines where to save the file. 
       bool? result = textDialog.ShowDialog(); 
       if (result == true) 
       { 
        using (Stream fs = (Stream)textDialog.OpenFile()) 
        { 
         fs.Write(fileBytes, 0, fileBytes.Length); 
         fs.Close(); 
        } 
       } 
      } 
+1

你'fileBytes'阵列是一个循环内初始化,所以它是不是在你的'下面if'语句的上下文中可用。 –

回答

1

你所得到的错误,因为fileBytes只传递给委托中存在的ForEach。试试这个:

private void executeSaveAttachment(object parameter) 
{ 
    using (var dlg = new SaveFileDialog()) 
    { 
     foreach (var table in Table) 
     { 
      if (dlg.ShowDialog() ?? false) 
      { 
       File.WriteAllBytes(dlg.FileName, table.Data) 
      } 
     } 
    } 
} 
+0

'Microsoft.Win32.SaveFileDialog':using语句中使用的类型必须隐式转换为'System.IDisposable' – KeyboardFriendly

+1

.NET框架中有3个SaveFileDialog类:一个用于WinForms(System.Windows.Forms.SaveFileDialog),一个用于WPF(System.Windows.Controls.SaveFileDialog),另一个用于Microsoft.Win32命名空间(不确定最后一个用于什么)。如果您使用的是WinForms,请使用第一个,它是一次性的,所以请使用using关键字。如果您使用的是其他任何一种,则它们不是一次性的,您可以删除using关键字。 –

0

对于WPF

private void executeSaveAttachment(object parameter) 
     { 
      SaveFileDialog dlg = new SaveFileDialog(); 
      { 
       foreach (var table in Table) 
       { 
        if (dlg.ShowDialog() ?? false) 
        { 
         File.WriteAllBytes(dlg.FileName, table.Data); 
        } 
       } 
      } 
     }