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

2017年7月1日C#,開発

おはようございます。

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

プログラムは例によって前回までのものを使います。

スポンサーリンク

画面の変更

画面に「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出力ボタンをクリックします。

ファイル保存ダイアログ

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

ファイル出力完了

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

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

ソースはこちら

GitHub

ではでは。

スポンサーリンク


関連するコンテンツ

2017年7月1日C#,開発C#,WPF,プログラミング

Posted by doradora