BETA

【WPF】DataGridの内容をSaveFileDialogを使ってCSVファイルに出力する

投稿日:2019-03-28
最終更新:2019-03-28
※この記事は外部サイト(https://www.doraxdora.com/blog/2017/07/01/...)からのクロス投稿です

おはようございます。

前回、CSVファイルの読み込みをやったので今回はファイル出力をやってみます。
WPFというか C# ですね。。

プログラムは例によって前回までのものを使います。
【WPF】TextFieldParser で CSVファイルを読み込む

画面の変更

画面に「CSV出力」ボタンを追加します。

MainWindow.xaml

次の記述を追加します。

<Button x:Name="exp_button" Content="CSV出力" HorizontalAlignment="Left" Margin="330,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="exp_button_Click"/>  

全体

<Window x:Class="WpfApp1.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        xmlns:local="clr-namespace:WpfApp1"  
        mc:Ignorable="d"  
        Title="一覧" Height="350" Width="530">  
    <Window.Resources>  
        <ResourceDictionary Source="/Style/StyleDic.xaml"/>  
    </Window.Resources>  

    <Grid>  
        <Grid.Resources>  
            <local:KindConverter x:Key="KindConv"/>  
        </Grid.Resources>  
        <Label Content="名前:" Margin="10,10,0,0" Style="{StaticResource lb-normal}"/>  
        <TextBox x:Name="search_name" Margin="56,12,0,0" Style="{StaticResource tx-normal}"/>  
        <Label Content="種別:" Margin="201,10,0,0" Style="{StaticResource lb-normal}"/>  
        <ComboBox x:Name="search_kind" Margin="252,12,0,0" Style="{StaticResource cb-normal}"/>  
        <Button x:Name="search_button" Content="検索" Margin="432,12,0,0" Style="{StaticResource btn-normal}" Click="search_button_Click"/>  

        <DataGrid Name="dataGrid" HorizontalAlignment="Left" Margin="10,43,0,0" Width="497" Height="225" Style="{StaticResource grid-normal}" >  
            <DataGrid.Columns>  
                <DataGridTextColumn Binding="{Binding No}" ClipboardContentBinding="{x:Null}" Header="No" IsReadOnly="True" Width="50"/>  
                <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="名前" IsReadOnly="True" Width="100"/>  
                <DataGridTextColumn Binding="{Binding Sex}" ClipboardContentBinding="{x:Null}" Header="性別" IsReadOnly="True" Width="40"/>  
                <DataGridTextColumn Binding="{Binding Age}" ClipboardContentBinding="{x:Null}" Header="年齢" IsReadOnly="True" Width="40"/>  
                <DataGridTextColumn Binding="{Binding Kind, Converter={StaticResource KindConv}}" ClipboardContentBinding="{x:Null}" Header="種別" IsReadOnly="True" Width="120"/>  
                <DataGridTextColumn Binding="{Binding Favorite}" ClipboardContentBinding="{x:Null}" Header="好物" IsReadOnly="True" Width="*"/>  
            </DataGrid.Columns>  
        </DataGrid>  
        <Button x:Name="add_button" Content="追加" HorizontalAlignment="Left" Margin="10,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="add_button_Click"/>  
        <Button x:Name="upd_button" Content="更新" HorizontalAlignment="Left" Margin="90,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="upd_button_Click"/>  
        <Button x:Name="del_button" Content="削除" HorizontalAlignment="Left" Margin="170,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="del_button_Click"/>  
        <Button x:Name="imp_button" Content="CSV読込" HorizontalAlignment="Left" Margin="250,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="imp_button_Click"/>  
        <Button x:Name="exp_button" Content="CSV出力" HorizontalAlignment="Left" Margin="330,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="exp_button_Click"/>  
    </Grid>  
</Window>  

ライブラリの使用宣言を追加

次の記述を追加します。

MainWindow.xaml.cs

using System.IO;  
using Microsoft.Win32;  

SaveFileDialogを利用するためのライブラリとなります。

クリックイベントの追加

CSV出力ボタンがクリックされた際のイベントを追加し、ファイルの出力処理を記述します。

MainWindows.xaml.cs

            /// <summary>  
            /// CSV出力ボタンクリックイベント.  
            /// </summary>  
            /// <param name="sender"></param>  
            /// <param name="e"></param>  
            private void exp_button_Click(object sender, RoutedEventArgs e)  
            {  
                // ファイル保存ダイアログ  
                SaveFileDialog dlg = new SaveFileDialog();  

                // デフォルトファイル名  
                dlg.FileName = "cat.csv";  

                // デフォルトディレクトリ  
                dlg.InitialDirectory = @"c:\";  

                // ファイルのフィルタ  
                dlg.Filter = "CSVファイル|*.csv|すべてのファイル|*.*";  

                // ファイルの種類  
                dlg.FilterIndex = 0;  

                // 指定されたファイル名を取得  

                if (dlg.ShowDialog() == true)  
                {  
                    List<Cat> list = this.dataGrid.ItemsSource as List<Cat>;  
                    String delmiter = ",";  
                    StringBuilder sb = new StringBuilder();  
                    Cat lastData = list.Last();  
                    foreach (Cat cat in list)  
                    {  
                        sb.Append(cat.No).Append(delmiter);  
                        sb.Append(cat.Name).Append(delmiter);  
                        sb.Append(cat.Sex).Append(delmiter);  
                        sb.Append(cat.Age).Append(delmiter);  
                        sb.Append(cat.Kind).Append(delmiter);  
                        sb.Append(cat.Favorite);  
                        if (!cat.Equals(lastData))  
                        {  
                            sb.Append(Environment.NewLine);  
                        }  
                    }  

                    Stream st = dlg.OpenFile();  
                    StreamWriter sw = new StreamWriter(st, Encoding.GetEncoding("UTF-8"));  

                    sw.Write(sb.ToString());  
                    sw.Close();  
                    st.Close();  
                    MessageBox.Show("CSVファイルを出力しました。");  
                }  
                else  
                {  
                    MessageBox.Show("キャンセルされました。");  
                }  

            }  

CSV出力してみる

修正後の画面を起動し、CSV出力ボタンをクリックします。

ファイル保存ダイアログが表示されます。
プログラム内で設定したデフォルトのファイル名や、ファイルの種類がちゃんと表示されていますね。

正常に出力が完了しました。
またまたあっさり終わっちゃいましたね。

次回はインストーラーの作成なんかやってみようかと思います。

ではでは。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!