データに関係する資料をエクスプローラーで探して格納、無ければフォルダを作成して格納、少し面倒ですよね。サンプルでは、一覧で添付フォルダを開き、なければ添付フォルダを作成します。
DataGridViewのデータに紐づく添付フォルダがあれば、一覧の添付列に添付を示す●が表示されます。●をダブルクリックすると、エクスプローラーで添付フォルダが表示されます。
添付フォルダのないデータの場合には、空欄の添付列をダブルクリックすると添付フォルダが作成され、一覧に●が表示されます。
添付フォルダ名はNoとしています。
作りとしては、「D:\添付」の下にあるサブフォルダを取得して、サブフォルダのつくNoを探して●をつけています。あとは添付フォルダ列(空欄)がダブルクリックされた時にNoのつくサブフォルダを作成しています。
サンプルを実行する前に「D:\添付」フォルダを作成しておいて下さい。
サンプルの内容
・添付フォルダがあれば一覧の添付フォルダ列に●を表示します。
・添付フォルダ列の●をダブルクリックするとエクスプローラーで添付フォルダを表示します。
・添付フォルダ列の空欄をダブルクリックすると添付フォルダを作成します。添付フォルダ名はNoです。
使用部品

No | 項目名 | Text | name | 部品 | イベント |
1 | 一覧 | 空 | dataGridView1 | DataGridView | CellDoubleClick |
2 | 表示ボタン | 表示 | button1 | Button | Click |
プログラミング
言語:C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace sample
{
public partial class Form1 : Form
{
// 添付フォルダのパス
private const string folder_PATH = @"d:\添付";
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 表示クリック処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
// データを作成する
dataGridView1.Tag = "書籍在庫一覧";
// データを作成する
DataTable dt = createData();
// データ行の高さを設定する
dataGridView1.RowTemplate.Height = 30;
// データの余白を左上右下5pxに設定する
//dataGridView1.RowTemplate.DefaultCellStyle.Padding = new Padding(5, 5, 5, 5);
// データの余白を左上右下5pxに設定する
dataGridView1.RowTemplate.DefaultCellStyle.Padding = new Padding(5);
// dataGridViewにデータをセットする
dataGridView1.DataSource = dt;
// ヘッダーのタイトルを設定する(列名指定)
dataGridView1.Columns["no"].HeaderText = "No";
dataGridView1.Columns["title"].HeaderText = "書名";
dataGridView1.Columns["author_name"].HeaderText = "著者名";
dataGridView1.Columns["price"].HeaderText = "価格";
dataGridView1.Columns["publisher"].HeaderText = "出版社名";
dataGridView1.Columns["publication_date"].HeaderText = "出版年月日";
dataGridView1.Columns["stock"].HeaderText = "在庫";
dataGridView1.Columns["folder"].HeaderText = "添付フォルダ";
// Visualスタイルを使用しない
dataGridView1.EnableHeadersVisualStyles = false;
// 列ヘッダの背景色を設定する
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Blue;
// 列ヘッダの文字色を設定する
dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;
// 行ヘッダーを非表示にする
dataGridView1.RowHeadersVisible = false;
// 列ヘッダーを表示する
dataGridView1.ColumnHeadersVisible = true;
// 列ヘッダーの高さを調整不可に設定する
dataGridView1.ColumnHeadersHeightSizeMode =
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
// 行ヘッダーの幅を調整不可に設定する
dataGridView1.RowHeadersWidthSizeMode =
DataGridViewRowHeadersWidthSizeMode.DisableResizing;
// 列ヘッダーの高さを設定する
dataGridView1.ColumnHeadersHeight = 30;
// no の配置を上下左右の中央に設定する
dataGridView1.Columns["no"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// title の配置を上下左右の中央に設定する
dataGridView1.Columns["title"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// author_name の配置を上下左右の中央に設定する
dataGridView1.Columns["author_name"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// price の配置を上下左右の中央に設定する
dataGridView1.Columns["price"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// publisher の配置を上下左右の中央に設定する
dataGridView1.Columns["publisher"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// publication_date の上下左右の中央に設定する
dataGridView1.Columns["publication_date"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// stock の配置を上下左右の中央に設定する
dataGridView1.Columns["stock"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// ユーザが行追加を不可に設定する
dataGridView1.AllowUserToAddRows = false;
// ユーザが行削除を不可に設定する
dataGridView1.AllowUserToDeleteRows = false;
// 複数セルの選択を不可に設定する
dataGridView1.MultiSelect = false;
// 行単位に選択モードを設定する
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
// ユーザが列の幅を変更不可に設定する
dataGridView1.AllowUserToResizeColumns = true;
// ユーザが行の高さを変更可に設定する
dataGridView1.AllowUserToResizeRows = false;
// セルの入力を不可に設定する
dataGridView1.ReadOnly = true;
// No(no) を右寄せに設定する
dataGridView1.Columns["no"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
// 書名(title) を左寄せに設定する
dataGridView1.Columns["title"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleLeft;
// 著者名(author_name) を左寄せに設定する
dataGridView1.Columns["author_name"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleLeft;
// 価格(price) を右寄せに設定する
dataGridView1.Columns["price"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
// カンマ表示(3けた単位)
dataGridView1.Columns["price"].DefaultCellStyle.Format = "#,0";
// 出版社名(publisher) を左寄せに設定する
dataGridView1.Columns["publisher"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleLeft;
// 出版年月日(publication_date) を中央に設定する
dataGridView1.Columns["publication_date"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// 在庫(stock)を中央に設定する
dataGridView1.Columns["stock"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// 添付フォルダ(folder)を中央に設定する
dataGridView1.Columns["folder"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// 列幅を設定する(列名指定)
dataGridView1.Columns["no"].Width = 40;
dataGridView1.Columns["title"].Width = 250;
dataGridView1.Columns["author_name"].Width = 100;
dataGridView1.Columns["price"].Width = 70;
dataGridView1.Columns["publisher"].Width = 150;
dataGridView1.Columns["publication_date"].Width = 80;
dataGridView1.Columns["stock"].Width = 50;
dataGridView1.Columns["folder"].Width = 50;
try
{
// 添付フォルダにあるサブフォルダを取得する
string[] folders = Directory.GetDirectories(folder_PATH, "*", SearchOption.TopDirectoryOnly);
// 取得したサブフォルダが一覧のNoと同じなら添付フォルダに●をつける
foreach (string folder in folders)
{
// サブフォルダ名のみ取得する
string folderName = System.IO.Path.GetFileName(folder);
// 一覧に、サブフォルダ名と一致するNoの先頭行を取得する
DataGridViewRow row =
dataGridView1.Rows.Cast<DataGridViewRow>().FirstOrDefault
(r => r.Cells["no"].Value.ToString() == folderName);
if (row != null)
{
// 一覧(添付フォルダ)に●をつける
row.Cells["folder"].Value = "●";
}
}
}
catch (Exception ex)
{
string msg = "添付フォルダの表示に失敗しました。" + Environment.NewLine + "例外[" + ex.ToString() + "]";
MessageBox.Show(msg, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
// 選択を解除する
dataGridView1.ClearSelection();
}
/// <summary>
/// データ(DataTable)作成処理
/// </summary>
/// <returns>データ</returns>
private DataTable createData()
{
// DataTableを宣言する
DataTable dt = new DataTable();
// 列を作成する
dt.Columns.Add("no", typeof(int)); // No
dt.Columns.Add("title", typeof(String)); // 書名
dt.Columns.Add("author_name", typeof(String)); // 著者名
dt.Columns.Add("price", typeof(Decimal)); // 価格
dt.Columns.Add("publisher", typeof(String)); // 出版社名
dt.Columns.Add("publication_date", typeof(DateTime)); // 出版年月日
dt.Columns.Add("stock", typeof(bool)); // 在庫
dt.Columns.Add("folder", typeof(String)); // 添付フォルダ
// データを追加する
dt.Rows.Add(1, "がんばれるC#入門", "坂本 学", 2980, "ABC出版", "2018/01/01", true, "");
dt.Rows.Add(2, "パーフェクトC#", "高橋 健一", 4200, "海上出版 ", "2019/03/03", false, "");
dt.Rows.Add(3, "学ぶC#", "工藤 太郎", 1600, "電気出版 ", "2020/08/04", true, "");
dt.Rows.Add(4, "初めてのC#", "渡辺 銀時", 2000, "川上出版 ", "2020/10/06", false, "");
dt.Rows.Add(5, "どんどん学べるC#", "沢田 剛", 3200, "心の友出版", "2020/11/11", true, "");
// DataTableを返す
return dt;
}
/// <summary>
/// 書籍在庫一覧ダブルクリック時処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
// ヘッダーなら何もしない
if (e.RowIndex == -1)
{
// 何もしない
return;
}
// 添付フォルダの列名を取得する
string folderHeaderText = dataGridView1.Columns["folder"].HeaderText;
// ダブルクリックされた列名を取得する
string ColumnsText = dataGridView1.Columns[e.ColumnIndex].HeaderText;
// ダブルクリックされた列名が添付フォルダでなければ何もしない
if (!folderHeaderText.Equals(ColumnsText))
{
// 何もしない
return;
}
// 添付フォルダのパス+Noを組み立てる
string path = folder_PATH + @"\" + dataGridView1["no", e.RowIndex].Value;
string msg = "";
try
{
// 添付フォルダがあるか判定する
if (dataGridView1[e.ColumnIndex, e.RowIndex].Value.Equals("●"))
{
// 念のため、本当に添付フォルダがあるか確認する
if (!Directory.Exists(path))
{
// なかった
// 一覧(添付フォルダ)の●を消す
dataGridView1[e.ColumnIndex, e.RowIndex].Value = "";
msg = "添付フォルダは見つかりませんでした。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
// 添付フォルダあり、添付フォルダを開く
System.Diagnostics.Process.Start("Explorer.exe", path);
return;
}
}
catch (Exception ex)
{
msg = "添付フォルダを開けませんでした。" + Environment.NewLine + "例外[" + ex.ToString() + "]";
MessageBox.Show(msg, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
// 添付フォルダなし、添付フォルダを作る
try
{
// 確認「はい」でなければ処理を抜ける
msg = "添付フォルダを作成します。" + "\n" + "宜しいですか?";
DialogResult result = MessageBox.Show(msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result != DialogResult.Yes)
{
return;
}
// 念のため、本当に添付フォルダがないか確認する
if (Directory.Exists(path))
{
// あった
// 一覧(添付フォルダ)に●をつける
dataGridView1[e.ColumnIndex, e.RowIndex].Value = "●";
msg = "添付フォルダは既に作成されています。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
// 添付フォルダを作成する
DirectoryInfo di = Directory.CreateDirectory(path);
// 一覧(添付フォルダ)に●をつける
dataGridView1[e.ColumnIndex, e.RowIndex].Value = "●";
msg = "添付フォルダを作成しました。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
msg = "添付フォルダの作成に失敗しました。" + Environment.NewLine + "例外[" + ex.ToString() + "]";
MessageBox.Show(msg, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
}
実行結果
前準備
・「d:\添付」フォルダを作成しておきます。
・「d:\添付\2」フォルダを作成しておきます。
・「d:\添付\2」フォルダに適当なファイルを格納しておきます。

実行して、表示ボタンをクリックします。

一覧が表示されます。
No2の添付フォルダ列に、添付フォルダがあることを示す●が表示されます。ダブルクリックします。

エクスプローラーで、No2の添付フォルダが表示されます。

次に添付フォルダのない、No4の添付フォルダ列をダブルクリックします。

確認メッセージが表示されます。「はい」をクリックします。

作成完了メッセージが表示されます。「OK」をクリックします。

No4の添付フォルダが作成されます、No4の添付フォルダ列に●が表示されます。

以上です。