Я загружаю и скачиваю файлы Word в своем веб-приложении. Я следил за двумя статьями, которые помогли мне сделать это возможным:
Как мне: импортировать и сохранить файл данных (здесь обсуждается только загрузка, но процесс аналогичен)
Загрузить и скачать файл в Lightswitch 2011
В моем решении загрузка и загрузка следуют шаблону из первой статьи ради симметрии. Меня не очень заботило то, как во второй статье обрабатывалась сторона загрузки. Я не могу точно вспомнить, нужны ли ссылки, упомянутые во второй статье, для того, как я это делал. У меня есть эти ссылки в моем проекте, но я знаю, что использую их для других целей. А в VS2013 по крайней мере выгрузка и перезагрузка проекта не требовались.
По сути, вам нужно создать собственный элемент управления Silverlight, чтобы добавить эту функциональность. Поэтому добавьте файл .xaml
в свой код пользователя. В обеих статьях есть примеры того, что там должно быть, и моя выглядит так:
<controls:ChildWindow x:Class="LightSwitchApplication.DownloadFileWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
Width="380" Height="125"
Title="Select Where to Save File" >
<Grid x:Name="LayoutRoot" Margin="2">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="25" HorizontalAlignment="Right" Margin="0,15,0,0" Grid.Row="1" />
<Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="25" HorizontalAlignment="Right" Margin="0,15,80,0" Grid.Row="1" />
<Button Content="Browse" Height="25" HorizontalAlignment="Left" Margin="275,10,0,0" Name="BrowseButton" VerticalAlignment="Top" Width="75" Click="BrowseButton_Click" />
<TextBox Height="25" HorizontalAlignment="Left" Margin="10,10,0,0" Name="FileTextBox" VerticalAlignment="Top" Width="250" IsEnabled="True"/>
</Grid>
</controls:ChildWindow>
VS2013 (который я использую) и LightSwitch 2011 (для которого написаны статьи) по-разному обрабатывают код, стоящий за .xaml
. Я не уверен, как с этим справляется VS2012, поэтому вам нужно будет разобраться с этой частью. Но в коде вашего пользовательского элемента управления Silverlight вам нужен конструктор, функции, которые устанавливают this.DialogResult
в true
и false
для кнопок OK и Cancel соответственно, и три свойства:
DocumentStream
как тип MemoryStream
для записи файла на ваш компьютер
SaveFileStream
как тип FileStream
для извлечения файла из базы данных
FileName
как тип String
Настоящая работа по сохранению файла происходит в коде кнопки Browse.
private void BrowseButton_Click(object sender, RoutedEventArgs e) {
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Word Files (*.docx)|*.docx|(*.docm)|*.docm";
saveFileDialog.DefaultExt = "docx";
if ((saveFileDialog.ShowDialog() == true)) {
// Get File name, store and display to user
this.FileTextBox.Text = saveFileDialog.FileName;
this.m_FileName = saveFileDialog.FileName;
this.FileTextBox.IsReadOnly = true;
try {
// Open and store the File Stream
this.DocumentStream = saveFileDialog.OpenFile();
}
catch (IOException ex) {
// Inform the user of the problem
MessageBox.Show("The file you are trying to save to is open in another applicaion." + "\r\n" + "Please close it and try again.", "File Already Open", MessageBoxButton.OK);
}
}
}
У меня есть Filter
и DefaultExt
для обработки документов Word, но вы можете изменить это для обработки .txt
или чего угодно. Я также добавил немного больше обработки ошибок, чем примеры в статьях, основанные на моем опыте ее использования.
Наконец, в коде экрана вам нужно вызвать пользовательский элемент управления в диспетчере Main
и записать файл в базу данных, когда пользовательский элемент управления закроется.
partial void DownloadFile_Execute()
{
// To invoke our own dialog, we have to do this inside of the "Main" Dispatcher
// And, since this is a web application, we can't directly invoke the Silverlight OpenFileDialog
// class, we have to first invoke our own Silverlight custom control (i.e. DownloadFileWindow)
// and that control will be able to invoke the OpenFileDialog class (via the Browse button)
Dispatchers.Main.BeginInvoke(() =>
{
DownloadFileWindow downloadFileWindow = new DownloadFileWindow();
downloadFileWindow.Closed += new EventHandler(downloadFileWindow_Closed);
downloadFileWindow.Show();
});
}
void downloadFileWindow_Closed(object sender, EventArgs e)
{
// Invoked when our custom Silverlight window closes
DownloadFileWindow downloadFile = (DownloadFileWindow)sender;
try {
// Continue if they hit the OK button AND they selected a file
if ((downloadFile.DialogResult == true)) {
// Write the document data stream from the database to the selected file
using (Stream saveStream = new Stream(downloadFile.DocumentStream))
{
downloadFile.DocumentStream.WriteTo(saveStream);
}
}
// Close and release the streams
downloadFile.DocumentStream.Close();
downloadFile.DocumentStream.Dispose();
downloadFile.SaveFileStream.Close();
downloadFile.SaveFileStream.Dispose();
}
catch (Exception ex) {
string res = "One or more save location errors have occured:" + "\r\n";
// Check to see if there is a Document Stream
if ((downloadFile.DocumentStream == null)) {
res = res + '\t' + "Document Stream is empty" + "\r\n";
}
// Check to see if there is a Save File Stream
if ((downloadFile.SaveFileStream == null)) {
res = res + '\t' + "Save File Stream is empty" + "\r\n";
}
// Check to see if there is a Safe File Name
if ((downloadFile.SafeFileName == null)) {
res = res + '\t' + "Safe File Name is empty" + "\r\n";
}
res = res + "\r\n" + "Please use the Browse button to select a location to save to. Specify a file name and then click Save.";
this.ShowMessageBox(res, "Save Location Error", MessageBoxOption.Ok);
}
}
Как видите, я добавил к этим функциям намного больше обработки ошибок, основываясь на опыте. Надеюсь, между двумя статьями и моими примерами вы сможете создать ту функциональность, которую хотите.
Примечание. Я преобразовал код из VB.NET, на котором написан мой проект. Поэтому могут быть ошибки, которые необходимо исправить, чтобы сделать синтаксис правильным для C#.
person
embedded.kyle
schedule
15.07.2014