【DBDictionary】本体コード

本体コード

using Common.Convert;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DBDictonary {
/// <summary>
/// 列情報
/// </summary>
class ColInfo {
public string Name { get; }
public string HeaderText { get; }
public ColInfo(string name, string headerText) {
Name = name;
HeaderText = headerText;
}
}

class DgvTableInfo {
public string TableName { get; set; }
public string TableNameL { get; set; }
}

/// <summary>
/// パーシャルクラス
/// </summary>
/// <remarks>データグリッド関連の処理を記載</remarks>
partial class DBDictionary {
//定数
private string Encod { get; } = "Shift-JIS";
private string FileName { get; } = "data.csv";
private string Delimiter { get; } = ",";
private bool Header { get; } = true;

private ColInfo ColInfo_TableName { get; } = new ColInfo("tableName", "テーブル名");
private ColInfo ColInfo_TableNameL { get; } = new ColInfo("tableNameL", "テーブル論理名");

private ColInfo ColInfo_ColumnName { get; } = new ColInfo("columnName", "列名");
private ColInfo ColInfo_ColumnNameL { get; } = new ColInfo("columnNameL", "列論理名");
private ColInfo ColInfo_ColType { get; } = new ColInfo("colType", "型");
private ColInfo ColInfo_ColLength { get; } = new ColInfo("colLength", "長さ");
private ColInfo ColInfo_PrimaryKey { get; } = new ColInfo("primaryKey", "型");

private DataTable DtCsvAll = new DataTable();
private List<DgvTableInfo> DgvInfo = new List<DgvTableInfo>();

/// <summary>
/// テーブルグリッド初期設定
/// </summary>
private void InitDgvTable() {
//テーブルグリッド
SettingDgv(dgvTable);
dgvTable.Columns.AddRange(
GetDgvCol(ColInfo_TableName),
GetDgvCol(ColInfo_TableNameL)
);

//列グリッド
SettingDgv(dgvColumn);
dgvColumn.Columns.AddRange(
GetDgvCol(ColInfo_TableName),
GetDgvCol(ColInfo_ColumnName),
GetDgvCol(ColInfo_ColumnNameL),
GetDgvCol(ColInfo_ColType),
GetDgvCol(ColInfo_ColLength),
GetDgvCol(ColInfo_PrimaryKey)
);

// TODO ファクトリにしておけばDBを対象にもできるよね
//グリッドデータ取得
var appDir = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
string fileFullPath = appDir + '\\' + FileName;
var csvConv = new CsvConverter(
Encoding.GetEncoding(Encod),
fileFullPath,
Delimiter,
Header
);

//テーブルは重複削除
DtCsvAll = csvConv.GetDataTable();
var dtTable = DtCsvAll.AsEnumerable()
.Select(row => new {
tableName = row.Field<string>(ColInfo_TableName.Name),
tableNameL = row.Field<string>(ColInfo_TableNameL.Name),
})
.OrderBy(x => x.tableName)
.Distinct()
.ToList();
DgvInfo = dtTable
.Select(row => new DgvTableInfo {
TableName = row.tableName,
TableNameL = row.tableNameL,
})
.ToList();

//データをバインド
dgvTable.DataSource = DgvInfo;
FillterDgvColumnByTableName(DgvInfo.FirstOrDefault()?.TableName);


/** イベント設定 **/
//テーブル行選択時
dgvTable.RowEnter += new DataGridViewCellEventHandler((sender, e) => {
var tableName = dgvTable.Rows[e.RowIndex].Cells[ColInfo_TableName.Name].Value.ToString();
FillterDgvColumnByTableName(tableName);
});

//テキスト入力時
txtTblName.TextChanged += new EventHandler((sender, e) => {
FillterDgvTableContainsTableName(txtTblName.Text);
});
//※1行だけならこの書き方もできる
//txtTblName.TextChanged += new EventHandler((sender, e) => FillterDgvTableContainsTableName(txtTblName.Text));
txtTblNameL.TextChanged += new EventHandler((sender, e) => {
FillterDgvTableContainsTableNameL(txtTblNameL.Text);
});
txtColName.TextChanged += new EventHandler((sender, e) => {
FillterDgvColumnsContainsColumnName(txtColName.Text);
});
txtColNameL.TextChanged += new EventHandler((sender, e) => {
FillterDgvColumnsContainsColumnNameL(txtColNameL.Text);
});

}


/// <summary>
/// グリッドプロパティ設定
/// </summary>
/// <param name="dgv"></param>
private void SettingDgv(DataGridView dgv) {
//列が自動生成されないようにする
dgv.AutoGenerateColumns = false;
//編集不可設定
dgv.AllowUserToAddRows = false;
dgv.AllowUserToDeleteRows = false;
dgv.ReadOnly = true;
dgv.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
//列幅設定
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
//左端列のサイズ
dgv.RowHeadersWidth = 20;
}

/// <summary>
/// グリッド列取得
/// </summary>
/// <param name="name"></param>
/// <param name="dataPropertyName"></param>
/// <param name="headerText"></param>
/// <returns></returns>
private DataGridViewTextBoxColumn GetDgvCol(ColInfo colInfo) {
return new DataGridViewTextBoxColumn() {
Name = colInfo.Name,
DataPropertyName = colInfo.Name,
HeaderText = colInfo.HeaderText,
};
}


#region "グリッド絞り込み"
private void FillterDgvColumnByTableName(string tableName) {
var dtColumn = DtCsvAll.AsEnumerable()
.Where(row => row[ColInfo_TableName.Name].ToString() == tableName)
.CopyToDataTable();
dgvColumn.DataSource = dtColumn;
}


private void FillterDgvTableContainsTableName(string tableName) {
var filterDgvInfo = DgvInfo
.Where(x => x.TableName.Contains(tableName))
.ToList();
;
dgvTable.DataSource = filterDgvInfo;
}

private void FillterDgvTableContainsTableNameL(string tableNameL) {
var filterDgvInfo = DgvInfo
.Where(x => x.TableNameL.Contains(tableNameL))
.ToList();
;
dgvTable.DataSource = filterDgvInfo;
}

 

private void FillterDgvColumnsContainsColumnName(string columnName) {
var dtColumn = DtCsvAll.AsEnumerable()
.Where(row => row[ColInfo_ColumnName.Name].ToString().Contains(columnName))
.CopyToDataTable();
dgvColumn.DataSource = dtColumn;
}
private void FillterDgvColumnsContainsColumnNameL(string columnNameL) {
var dtColumn = DtCsvAll.AsEnumerable()
.Where(row => row[ColInfo_ColumnNameL.Name].ToString().Contains(columnNameL))
.CopyToDataTable();
dgvColumn.DataSource = dtColumn;
}
#endregion


}
}