【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 } }