tag:crieit.net,2005:https://crieit.net/tags/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/feed
「サンプル」の記事 - Crieit
Crieitでタグ「サンプル」に投稿された最近の記事
2019-06-14T10:01:30+09:00
https://crieit.net/tags/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/feed
tag:crieit.net,2005:PublicArticle/15106
2019-06-14T09:58:06+09:00
2019-06-14T10:01:30+09:00
https://crieit.net/posts/WPF-CSV
【WPF】フォルダ選択ダイアログを表示して複数のCSVファイルを読み込む
<p>おはようございます。</p>
<p>WPFでは、Windowsフォームと違いデフォルトでフォルダ選択のコントロールがないようです。</p>
<p>いくつか方法はあるようですが、<br />
今回は 「Microsoft.WindowsAPICodePack」というライブラリを使って実装してみたいと思います。</p>
<p>いつも通り、前回までのプログラムを流用します。<br />
<a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/07/01/post-1396/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【WPF】DataGridの内容をCSVファイルに出力する</a></p>
<h2 id="画面の変更"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E5%A4%89%E6%9B%B4">画面の変更</a></h2>
<p>画面にフォルダ参照ボタンを追加します。</p>
<pre><code><Button x:Name="fld_button" Content="フォルダ参照" HorizontalAlignment="Left" Margin="410,273,0,0" VerticalAlignment="Top" Width="97" Height="30" Click="fld_button_Click"/>
</pre>
MainWindow.xaml
<pre class="lang:xhtml decode:true"><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<span>}</span><span>}</span>" 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"/>
<Button x:Name="fld_button" Content="フォルダ参照" HorizontalAlignment="Left" Margin="410,273,0,0" VerticalAlignment="Top" Width="97" Height="30" Click="fld_button_Click"/>
</Grid>
</Window>
</code></pre>
<h2 id="追加ライブラリ"><a href="#%E8%BF%BD%E5%8A%A0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA">追加ライブラリ</a></h2>
<p>Nugetで次のライブラリを参照に追加します。</p>
<pre><code> Microsoft.WindowsAPICodePack.Core
Microsoft.WindowsAPICodePack.Shell
</code></pre>
<h3 id="Coreパッケージ"><a href="#Core%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8">Coreパッケージ</a></h3>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog000.jpg" alt="image" /></p>
<p>ソリューションエクスプローラーから「参照」>「NuGet パッケージの管理」を選択します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog001.jpg" alt="image" /></p>
<p>WindowsAPICodePack と入力しパッケージを絞り込み、<br />
表示されたリストから「Microsoft.WIndowsAPICodePack.Core」を選択、<br />
「インストール」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog002.jpg" alt="image" /></p>
<p>プレビュー画面が表示された場合は、「OK」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog003.jpg" alt="image" /></p>
<p>出力ビューに「終了」が出力されれば完了。</p>
<h3 id="Shellパッケージ"><a href="#Shell%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8">Shellパッケージ</a></h3>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog004.jpg" alt="image" /></p>
<p>Coreパッケージと同様、NuGet パッケージの管理画面にて<br />
絞込表示されたリストから「Microsoft.WindowsAPICodePack.Shell」を選択<br />
「インストール」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog005.jpg" alt="image" /></p>
<p>プレビュー画面が表示された場合は「OK」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog006.jpg" alt="image" /></p>
<p>出力ビューに「終了」が出力されれば完了です。</p>
<h2 id="ライブラリ使用宣言の追加"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E4%BD%BF%E7%94%A8%E5%AE%A3%E8%A8%80%E3%81%AE%E8%BF%BD%E5%8A%A0">ライブラリ使用宣言の追加</a></h2>
<p>インストールしたライブラリを使用するための宣言を追記します。</p>
<p>MainWindow.xaml.cs</p>
<pre><code>using Microsoft.WindowsAPICodePack.Dialogs;
</code></pre>
<p> </p>
<h2 id="処理の追加"><a href="#%E5%87%A6%E7%90%86%E3%81%AE%E8%BF%BD%E5%8A%A0">処理の追加</a></h2>
<h3 id="複数ファイル読み込み処理"><a href="#%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E5%87%A6%E7%90%86">複数ファイル読み込み処理</a></h3>
<p>MainWindow.xaml.cs</p>
<pre><code> /// <summary>
/// ディレクトリ内のCSVファイルを全て読み込む
/// </summary>
/// <param name="sourceDir"></param>
private List<Cat> readFiles(String sourceDir)
{
string[] files = Directory.GetFiles(sourceDir, "*.csv");
List<Cat> list = new List<Cat>();
// リストを走査してコピー
for (int fileCount = 0; fileCount < files.Length; fileCount++)
{
List<Cat> catList = readFile(files[fileCount]) as List<Cat>;
list.AddRange(catList);
}
return list;
}
</code></pre>
<p> </p>
<h3 id="ボタンクリックイベント処理"><a href="#%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%87%A6%E7%90%86">ボタンクリックイベント処理</a></h3>
<p>MainWindow.xaml.cs</p>
<pre><code> /// <summary>
/// フォルダ参照ボタンクリックイベント.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void fld_button_Click(object sender, RoutedEventArgs e)
{
// ダイアログ生成
CommonOpenFileDialog dlg = new CommonOpenFileDialog();
// パラメタ設定
// タイトル
dlg.Title = "フォルダ選択";
// フォルダ選択かどうか
dlg.IsFolderPicker = true;
// 初期ディレクトリ
dlg.InitialDirectory = @"c:\";
// ファイルが存在するか確認する
//dlg.EnsureFileExists = false;
// パスが存在するか確認する
//dlg.EnsurePathExists = false;
// 読み取り専用フォルダは指定させない
//dlg.EnsureReadOnly = false;
// コンパネは指定させない
//dlg.AllowNonFileSystemItems = false;
//ダイアログ表示
var Path = dlg.ShowDialog();
if (Path == CommonFileDialogResult.Ok)
{
// 選択されたフォルダ名を取得、格納されているCSVを読み込む
List<Cat> list = readFiles(dlg.FileName);
// 接続
int count = 0;
using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite"))
{
conn.Open();
// データを追加する
using (DataContext context = new DataContext(conn))
{
foreach (Cat cat in list)
{
// 対象のテーブルオブジェクトを取得
var table = context.GetTable<Cat>();
// データが存在するかどうか判定
if (table.SingleOrDefault(x => x.No == cat.No) == null)
{
// データ追加
table.InsertOnSubmit(cat);
// DBの変更を確定
context.SubmitChanges();
count++;
}
}
}
conn.Close();
}
MessageBox.Show(count + " / " + list.Count + " 件 のデータを取り込みました。");
// データ再検索
searchData();
}
}
</code></pre>
<p> </p>
<h2 id="CSVファイルの作成"><a href="#CSV%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90">CSVファイルの作成</a></h2>
<p>cat1.csv</p>
<pre><code>1,そら,♂,6,01,犬の人形
2,りく,♂,5,02,人間
3,うみ,♀,4,03,高級ウェットフード
4,こうめ,♀,2,04,横取り
5,こなつ,♀,7,01,布団
</code></pre>
<p>cat2.csv</p>
<pre><code>6,なな,♀,19,01,こたつ
</code></pre>
<h2 id="実行してみる"><a href="#%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">実行してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog007.jpg" alt="image" /></p>
<p>アプリケーションを起動し、「フォルダ選択」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog008.jpg" alt="image" /></p>
<p>フォルダ選択ダイアログが表示されるので、<br />
作成したCSVが格納されているフォルダ―を選択し、「フォルダ―の選択」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog009.jpg" alt="image" /></p>
<p>読込が無事に終了しました。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/07/CommonFileDialog010.jpg" alt="image" /></p>
<p>追加したデータが画面に表示されることを確認。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>今回紹介した「WindowsAPICodePack」は、<br />
他にもいろいろなことが出来るようなのでそのうち試してみたいと思います。</p>
<p>ソースはこちら</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/doraxdora/SampleWpfSQLite6" target="_blank" rel="noopener noreferrer">GitHub</a></p>
<p>ではでは。</p>
doraxdora