前提・実現したいこと
【相談内容】
DataGridViewに表示されてる日時(時間含む)の日付のみを
部分又は前方一致検索できるようにしたいのでアドバイスをお願いします。
【詳細】
C#で社員番号や勤務時間の入力と日報作成のためのツールを作っています。
私はロガーを担当をしていて、ログ内容をテキストメモに出力させ
それをWindows FormsのDataGridViewで表示させるところまでできました。
直接DataGridViewに出力させないのはなるべくメモリの消費を抑えるためです。
また上記と同じ理由でデータベースにも接続せずに使いたいです。
(実際データグリッドに出力はできているので。)
NLogを使用しており、NLog.config(XML)内のlayoutで
${longdate}(書式はyyyy-MM-dd HH:mm:ss:mmmです)
を使用しているのでデータグリッドにもそのように表示されます。
検索機能を作成するにあたって、ログレベルは短い単語なので完全一致で
いいのですが、日付の検索もyyyy-MM-dd HH:mm:ss:mmmの形の完全一致でしかできません。
日付のみの部分(前方)一致での検索機能を付けるのに苦戦しています。
どなたかアドバイスをお願いできないでしょうか。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
C#
1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 toolTip1 = new ToolTip(); 7 } 8 9 private void Form1_Load(object sender, EventArgs e) 10 { 11 showLogs(); 12 } 13 14 private void button_Search_Click(object sender, EventArgs e) 15 { 16 searchLogs(); 17 } 18 19 private void button_Close_Click(object sender, EventArgs e) 20 { 21 try 22 { 23 throw new Exception(); 24 } 25 catch 26 { 27 LogUtil.Info("テスト ログ出力"); 28 29 } 30 31 Close(); 32 } 33 34 DataTable table = new DataTable(); 35 36 public void showLogs() 37 { 38 table.Columns.Add("日付と時刻", typeof(string)); 39 table.Columns.Add("ログレベル", typeof(string)); 40 table.Columns.Add("メッセージ", typeof(string)); 41 table.Columns.Add("情報", typeof(string)); 42 43 dataGridView1.DataSource = table; 44 45 string[] lines = File.ReadAllLines(@"C:~~~\testlog\testlog.log"); 46 string[] values; 47 48 for (int i = 0; i < lines.Length; i++) 49 { 50 values = lines[i].ToString().Split('/'); 51 string[] row = new string[values.Length]; 52 53 for (int j = 0; j < values.Length; j++) 54 { 55 row[j] = values[j].Trim(); 56 } 57 58 table.Rows.Add(row); 59 } 60 61 } 62 63 public void searchLogs() 64 { 65 DataTable sub = new DataTable("sub"); 66 67 DataRow[] dRows1 = table.AsEnumerable() 68 .Where(row1 => row1.Field<string>("日付と時刻") == textBox1.Text).ToArray(); 69 70 DataRow[] dRows2 = table.AsEnumerable() 71 .Where(row2 => row2.Field<string>("ログレベル") == comboBox1.Text).ToArray(); 72 73 // カラム名の追加 74 sub.Columns.Add("日付と時刻"); 75 sub.Columns.Add("ログレベル"); 76 sub.Columns.Add("メッセージ"); 77 sub.Columns.Add("情報"); 78 79 foreach (var row1 in dRows1) 80 { 81 sub.Rows.Add(row1[0], row1[1], row1[2], row1[3]); 82 } 83 84 foreach (var row2 in dRows2) 85 { 86 sub.Rows.Add(row2[0], row2[1], row2[2], row2[3]); 87 } 88 89 dataGridView1.DataSource = sub; 90 91 //以下試してみたけど動きませんでした。 92 System.Text.RegularExpressions.MatchCollection dRow1 = 93 System.Text.RegularExpressions.Regex.Matches( 94 textBox1.Text, @"\d\d\d\d-\d\d-\d\d"); 95 foreach (System.Text.RegularExpressions.Match m in dRow1) 96 { 97 sub.Rows.Add(row1[0], row1[1], row1[2], row1[3]); 98 } 99 } 100 } 101
試したこと
・NLog.configの${longdate}はハイフンで日時が表示されるので
スラッシュ表記のDateTimePickerはできなさそうでした。
・DateSetを使用していないのでMatch,Selectメソッドはダメでした。
・ContainsメソッドやIndexOfメソッドの仕様が最適だと考えているのですが
データグリッドの内容をコードで直接書いているわけでない(テキストの読み込み)ので
書き方がわかりませんでした。
・
補足情報(FW/ツールのバージョンなど)
環境:Visual Studio 2019
回答2件
あなたの回答
tips
プレビュー