2019-03-28に更新

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

おはようございます。

前回、CSVファイルの読み込みをやったので今回はファイル出力をやってみます。

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

画面の変更

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

image

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

image

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

image

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

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

ではでは。

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント