0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#のテンプレート

Last updated at Posted at 2022-11-07

良く使うコード、たまにしか使わないので忘れてしまうコード等を書き留めます。

1.構造体をListにする (配列[]は使えません)

構造体を配列にするには、Listを使うしかないです。

C#
        private struct structAAA 
        {
            public int x1;      //publicにしないと同じクラスからアクセスできないみたい。
            public int x2;
            public int x3;
            public int x4;
            public string text;  //文字列も含めちゃいましょ。

            public structAAA(int c1, int c2, int c3, int c4, string str1)   //コンストラクタ
            {
                this.x1 = c1;
                this.x2 = c2;
                this.x3 = c3;
                this.x4 = c4;
                this.text = str1;
            }
        }

        //ここでList宣言!
        private List<structAAA> sA = new List<structAAA>();

        //要素追加
       sA.Add(new structAAA(10, 20, 30, 40 , "こんにちは"));   //次々にAddしてください…

        //取り出し
        for (int i =  0; i < sA.Count; i++)
        {
            int tmpInt = structAAA[i].x1
            //こんな感じで…
        }

2.配列を動的に増やす

但し、Array.Resizeできるのは1次元配列のみ。

C#
    string[] 顧客 = new string[0];   //空の配列を作る。

    for(int i= 0; i < 9; i++)
    {
        Array.Resize(ref 顧客, i + 1);  //配列のリサイズ。既存値はそのまま。リサイズ直後の値はNull(のようだ)。
    	顧客[i] = i;
    	Console.WriteLine(顧客[i]);
    }

    Console.WriteLine("要素数: "+ 顧客.length);

3.コントロールを静的配列にする

静的なら、これが一番簡単かな?

C#
       //テキストボックスの配列を準備する。
        Control[] textBox配列 = new Control[10];

        private void Form_Load(object sender, EventArgs e)
        {
            //テキストボックスを配列にセットする。
            textBox配列[0] = this.textBox1;
            textBox配列[1] = this.textBox2;
            textBox配列[2] = this.textBox3;
            textBox配列[3] = this.textBox4;
            textBox配列[4] = this.textBox5;
            textBox配列[5] = this.textBox6;
            textBox配列[6] = this.textBox7;
            textBox配列[7] = this.textBox8;
            textBox配列[8] = this.textBox9;
            textBox配列[9] = this.textBox10;
        }

        private void XXX()
        {
            for (int i = 0; i < 9; i++)
            {
                textBox配列[i].Text = i.ToString();

            }
        }

4.DataTableの扱い方

C#
        //DataTableを空にするためのDataTable (これ便利アル)
        DataTable dt = new DataTable();

        //結果をセットする為のDataTable 
        DataTable dt = new DataTable();

		//カラム定義
		dt.Columns.Add("社員番号", typeof(String));
		dt.Columns.Add("氏名", typeof(String));
		dt.Columns.Add("入社日", typeof(DateTime));
		dt.Columns.Add("提案回数", typeof(int)).DefaultValue = 0;   //[重要]初期値を0にする場合
		
		DataRow dr;

		//データセット
		dr = dt.NewRow();

		dr["社員番号"] = "A1234"
		dr["氏名"] = "山田 一郎"
		dr["入社日"] = "2020/01/01"
		dr["提案回数"] = 3

		dt.Rows.Add(dr);  // テーブルに追加

		//読出し
		Console.WriteLine(dt.Rows[0]["社員番号"]);  //A1234
    
        //Select文
        //  引数(where句, order by句)
        //  注意:選択される行が無ければエラーだよ!
        DataTable dt2 = dt.Select(" [氏名] LIKE '%山田%'" , "[入社日] asc").CopyToDataTable();

        //何行Selectされるか知りたい場合はこれを前段に↓
        int rowsCount = dt.Select("・・・", "・・・").Length;
        if (rowsCount <= 0)
        {
              //0行なら処理中断!
              MessageBox.Show("メッセージ");
              return;
        }

        //ループ2種
        foreach (DataRow dr in dt.Rows)
        {
             Console.WriteLine(dr["氏名"]);
        }

        for (int i = 0; i < dt2.Rows.Count; i++)
        {
            Console.WriteLine(dt2.Rows[i]["氏名"]);
        }
        
        //構造とデータをまるっとコピー
        DataTable dt3 = dt.Copy();

        //構造のみコピー
        DataTable dt4 = dt.Clone(); 

        //値のみクリア
        dt.Clear();   //カラム定義は残るよ

        //値もカラム定義も削除。
        dt = dt.Copy();

5.Dictionary / SortedDictionary

C#
            //何処でも書ける定義方法↓
            Dictionary<string, string> dicA = new Dictionary<string, string>();
            
            //↓メソッド内ではこの書き方でも可
            var dicA = new Dictionary<string, string>();

            dicA["0001"] = "リンゴ";
            dicA["0002"] = "みかん";
            
            //Keyを指定し要素を削除する
            bool result = dicA.Remove("0002");

            //全要素削除
            dicA.Clear();
            
            // ループ変数にKeyValuePairを使う
            foreach (KeyValuePair<string, string> kvp in dicA)
            {
                string コード= kvp.Key;
                string 内容  = kvp.Value;
                Console.WriteLine("表示: {0} / {1}", コード, 内容);
            }


            //keyの昇順でソートしてくれる!
            var dicB = new SortedDictionary<int, string>
                {
                    { 3, "ブドウ" },
                    { 2, "イチゴ" },
                    { 1, "かぼちゃ" },
                };

            foreach (var r in dicB)
            {
                Console.WriteLine(r.Key + ": " + r.Value);
            }

50.Yes/No確認

C#
            //Yse/No確認
            DialogResult result = MessageBox.Show("登録しますか?",
                "登録確認",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question,
                MessageBoxDefaultButton.Button2);     //Button2-> デフォルト選択ボタン

            //結果確認
            if (result == DialogResult.Yes)
            {
                //処理無し
            }
            else if (result == DialogResult.No)
            {
                return;
            }

51.タイマーの1回目を即起動させる

タイマーでIntervalを60000と設定した場合、初回の起動が1分後になる。
初回だけを即実行する方法はこれ。
先に実行して、後はタイマーのInterval毎にまかせる。

C#
        private void button1_Click(object sender, EventArgs e)
        {
            //初回を実行
            timer1_Tick(sender,e);
            
            //後は設定時間毎に実行
            timer1.Enabled = true;
        }
        
        private void timer1_Tick(object sender, EventArgs e)
        {
                //処理いろいろ
        }

52.textBoxに行数制限

Multiline有効にしたtextBoxにログを残す様な場合、新しい行から(下から)指定行残します。
指定行に満たない場合はそのままにします。

C# 呼出側
        private void button1_Click(object sender, EventArgs e)
        {
            textBox行数制限(textBox1, 100);   //100行残したい
        }
C# メソッド
        private void textBox行数制限(System.Windows.Forms.TextBox t, int maxRows )
        {
            /**************************************************************************************
             *  MultilineプロパティをtrueにしたtextBoxについて、
             *  下から指定行のみを残す。(下の方が新しい前提)
             *  【注意】改行記号のみの行も1行としてます。
             *   
             *      textBox: 制限対象とするtextBox
             *      maxRows: 下から数えて残す行数
             *************************************************************************************/

            Console.WriteLine("t      : " + t.ToString());
            Console.WriteLine("maxRows: " + maxRows.ToString());

            int rowCount = t.Lines.Length;
            Console.WriteLine("現在の行数: " + rowCount.ToString());

            int remainRow = rowCount - maxRows;     // ex. 4 = 7 - 3

            List<string> oldLines = new List<string>(t.Lines);
            List<string> newLines = new List<string>();

            int i = 0;
            foreach (var line in oldLines)
            {
                Console.WriteLine(" 要素:" + i.ToString() + " / " + line.ToString());
                if (i >= remainRow)
                {
                    newLines.Add(line.ToString());
                }
                i = i + 1;
            }

            t.Text = String.Join("\r\n", newLines);       //新List代入
            
            //最下端を表示する。
            t.SelectionStart = t.Text.Length;   //カレット位置を末尾に移動
            t.Focus();                          //テキストボックスにフォーカスを移動
            t.ScrollToCaret();                  //カレット位置までスクロール
        }

53.mp3を鳴らすぞ

[設定1] プロジェクトの参照に、C:\Windows\System32\wmp.dllを追加する
[設定2] 必要に応じ、using WMPLib; を追記する。

C# 宣言
        //メディアプレーヤ関連
        WMPLib.WindowsMediaPlayer mediaPlayer = new WMPLib.WindowsMediaPlayer();
C# メソッド
        private void Sound(string )
        {
            string url = "";

            switch ()
            {
                case "ピンポン":
                    url = @".\Sound\効果音_ピンポン.mp3";
                    break;
                    
                case "不正解":
                    url = @".\Sound\効果音_不正解.mp3";
                    break;
                    
                default:
                    return;
            }

            //オーディオファイルを指定する
            mediaPlayer.URL = url;
            //効果音を再生する
            mediaPlayer.controls.play();
            
            //止める場合は、別ボタンに
            //mediaPlayer.controls.stop();

        }

54.TabControlでタブ名指定しタブ移動

C# メソッド
        private void タブ移動(string 移動先タブ名)
        {
            //移動先ページの設定
            string targetPage = 移動先タブ名;
            int targetIndex = -1;
            //Console.WriteLine("tp.TabCount.ToString(): " + tabControl1.TabCount);

            for (int i = 0; i < tabControl1.TabCount; i++)
            {
                if (tabControl1.TabPages[i].Text == targetPage)
                {
                    targetIndex = i;
                }
                //Console.WriteLine("i: " + i.ToString());
                //Console.WriteLine("tp.TabCount.ToString(): " + tabControl1.TabPages[i].Text);
                //Console.WriteLine("");
            }

            //タブ移動
            tabControl1.SelectedIndex = targetIndex;
        }

70.非同期に挑戦

非同期で同じメソッドを複数起動して、全てが終わるまで待つ。
そして、終わったら戻り値を確認する。
これでいいのかな…?

C# Fromクラス
        private void button1_Click(object sender, EventArgs e)
        {
            非同期処理();
        }

        private async void 非同期処理()
        {
            Console.WriteLine("↓↓↓非同期処理()に入りました。↓↓↓↓");

            ClassBigProcess c = new ClassBigProcess();

            Task<string> taskA = Task.Run(() => c._膨大処理(2000, 196));
            Task<string> taskB = Task.Run(() => c._膨大処理(1500, 267));
            Task<string> taskC = Task.Run(() => c._膨大処理( 500, 101));

            await Task.WhenAll(taskA, taskB, taskC);  //ここで3つの終了を待つ

            //結果
            Console.WriteLine("taskA:" + taskA.Result);
            Console.WriteLine("taskB:" + taskB.Result);
            Console.WriteLine("taskC:" + taskC.Result);
            Console.WriteLine("↑↑↑非同期処理()が終了しました。↑↑↑");
        }
C# ClassBigProcess
    class ClassBigProcess
    {
        public async Task<string> _膨大処理(int MSec, int ID)
        {
            //指定ミリ秒停止する
            await Task.Delay(MSec);

            Console.WriteLine("Delay:" + MSec.ToString() + "ミリ秒間停止しました。");

            //エラーは無いと思うので、OKを返す
            return "OK:" + ID;
        }
    }
C# 出力
↓↓↓非同期処理()に入りました。↓↓↓↓
Delay500ミリ秒間停止しました。
Delay1500ミリ秒間停止しました。
Delay2000ミリ秒間停止しました。
taskA:OK:196
taskB:OK:267
taskC:OK:101
↑↑↑非同期処理()が終了しました。↑↑↑

80.--- DB操作/SQLServer ---

80-0.DB接続文字列

C#
            DB接続文字列 = @"Data Source=サーバのホスト名 or サーバのIPアドレス;
                            Initial Catalog=データベース名;
                            User Id=ユーザ名;
                            Password=パスワード;";

80-1.Select

C#
            using (SqlConnection connection = new SqlConnection(DB接続文字列))
            using (SqlCommand command = new SqlCommand())
            {
                connection.Open();
                command.Connection = connection;

                SQL = "select カラム名 from …";

                command.CommandText = SQL;

                //SQLを実行。
                SqlDataReader reader = command.ExecuteReader();

                //結果受取り
                if (reader.HasRows == true)
                {
                    //レコード有り!
                    while (reader.Read())
                    {
                        フィールド等 = reader["カラム名"].ToString();
                    }
                }
                else
                {
                    //レコード無し
                }
                reader.Close();
            }

80-2.Update, Insert, etc

C#
        public string SQL実行_ExecuteNonQuery(string DB接続文字列, string sql)
        {
            //DB接続文字列とSQL(Update,Insert etc...)をもらって実行する
            
            string Result;

            using (SqlCommand command = new SqlCommand())
            {
                SqlConnection conn = new SqlConnection();
                conn.ConnectionString = DB接続文字列;

                // トランザクションを開始します。
                conn.Open();
                SqlTransaction transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {
                    command.CommandText = sql;
                    command.Connection = conn;
                    command.Transaction = transaction;
                    command.ExecuteNonQuery();

                    //トランザクションをコミットします。
                    transaction.Commit();
                    Result = "OK";
                }
                catch (System.Exception)
                {
                    //トランザクションをロールバックします。
                    transaction.Rollback();
                    Result = "NG";
                    //throw;
                }
                finally
                {
                    conn.Close();
                }
                return Result;
            }
        }

85.--- ファイル操作 ---

85-1.エクセル操作(Range/Cell指定)

アンマネージドのCOMの「Microsoft.Office.Interop.Excel」を使うぞ~。
賛否両論あるけども、会社毎のシステムポリシーとか、開発者の置かれている状況・立場とか、配布先PCの状況もあるので、使える様にしておくのも手かと。
タスクマネージャでメモリーリークしてないこと確認したが…それにしても反応遅し(TT)
できれば使いたくない。

参考にさせて頂いた先生方、感謝。
* https://www.ipentec.com/document/csharp-open-read-excel-book-and-sheet
* https://qiita.com/tomohideyo/items/f46eab04b86316d917c5
* https://qiita.com/ANNEX_IBS/items/8308fb193dd987c0899e

C#

using Microsoft.Office.Interop.Excel;

        public string _ExcelRead_Cell(string fullPath, string taegetSheet, int row, int col)
        {
            /*【概要】***************************************************************************** 
            *   [参照先]
            *   using Microsoft.Office.Interop.Excel;
            *   
            *   fullPathで指定されたエクセルファイルのsheetで指定されたシートについて、
            *   colStart、rowStartで指定されたセルの値を戻す。
            *   
            *   [戻り値]
            *       正常完了時 ⇒指定された値
            *       異常終了時 ⇒"NG:エラーメッセージ"
            *        
            **************************************************************************************/

            string result = "OK";

            //エクセルを開く
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            Workbooks xlBooks = null;
            Workbook  xlBook = null;
            Worksheet xlsheet = null;
            //Range     xlRange = null;
            //Range     rangeW = null;
            Range     rangeR = null;
            try
            {
                //エクセルを見えない状態で開く
                xlApp.Visible = false;

                //ファイルを開く
                xlBooks = xlApp.Workbooks;
                xlBook = xlApp.Workbooks.Open(fullPath);

                //シートの指定
                xlsheet = xlBook.Sheets[taegetSheet];

                //読込***************************************
                //[その1]レンジの指定の場合-----------------
                //xlRange = xlsheet.Range["A1", "B2"];
                //[注意]同一セルだとエラーになる。(ここでのxlsheet.Cellsはセーフ)
                //xlRange = xlsheet.Range[xlsheet.Cells[row, col], xlsheet.Cells[row + 1, col + 1]];
                //object[,] values = xlRange.Value; // 選択した領域の値をメモリー上に格納
                //gotten = values[1, 1].ToString();

                //[その2]セルの指定の場合---------------------
                var cellsR = xlsheet.Cells;
                rangeR = cellsR[row, col];
                result = rangeR.Value;

                ////書込み**************************************
                //var cellsW = xlsheet.Cells;
                //rangeW = cellsW[5, 4] ;
                //rangeW.Value = "書込んだよ99";

                ////保存***************************************
                //xlApp.DisplayAlerts = false;    //アラートの停止
                //xlBook.Save();
            }
            catch(Exception e)
            {
                result = "NG:" + e.ToString();
            }
            finally
            {
                //後処理---------------------------------------------------------------------------------------------------
                // 使用したCOMオブジェクトを解放その1
                if (rangeR != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(rangeR);
                //if (rangeW != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(rangeW);
                //if (xlRange != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
                if (xlsheet != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheet);

                //【ポイント】強制メモリー破棄
                GC.Collect();
                GC.WaitForPendingFinalizers(); //これなんやろ?いるのかな?
                GC.Collect();

                // Excelのクローズ
                xlBook.Close();
                xlApp.Quit();

                // 使用したCOMオブジェクトを解放その2
                if (xlBook != null) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook);
                if (xlBooks != null) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBooks);
                if (xlApp != null) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp);

                //【ポイント】強制メモリー破棄
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }
            return result;
        }

【超重要】
エクセルのフォーマットが日付になっていると、少数で受けっとってしまう。
これをDateTimeに戻すのがこれ↓

C#
        DateTime tmp = DateTime.FromOADate(double.Parse(values[1, k].ToString()));

85-2.エクセル操作(Sheetまるごと)

アンマネージドのCOMの「Microsoft.Office.Interop.Excel」を使って…
Sheetを2次元配列にセットして戻すメソッド。
【超重要】
但し、usedRangeメソッドを使うので、「書式変更あり&値無し」のセルも利用範囲(Range)として切り取ってしまう。
後処理で注意要!

C# 呼出側

            //引数設定
            string fullPath = "フルパス";
            string sheetName = "Sheet1";
            string errMsg = "";   //文字列無しで渡す
            
            ClassExcel cExcel = new ClassExcel();
            object[,] array = cExcel.エクセル読み込み(fullPath, sheetName, ref errMsg);
            if (array == null)
            {
                //戻り値がnullだった場合の処理
            }
            
            // 戻り値(2次元配列)を別の2次元配列へコピー 
            // 【注意】
            //   ・戻り値(2次元配列)は1始まりの配列となっている!!!(「Microsoft.Office.Interop.Excel」の仕様?)
            //   ・が、Array.Copyした2次元配列添え字は(いつも通りの)0始まりとなる。
            
            object[,] arraySAP = new object[array.GetLength(0), array.GetLength(1)];
            Array.Copy(array, arraySAP, array.Length);

C# 別クラスのメソッド

using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

        public object[,] エクセル読み込み(string fullPath, string sheetName, ref string errMsg)
        {
            /**************************************************************************************
             * [引数]
             *  fullPath : 対象となるエクセルファイルフルパス
             *  sheetName: 読込み対象となるシート
             *  errMsg: (参照渡し)エラー発生時のコメントを返す
             * [戻り値] 
             *  シート上のデータを2次元配列にセットして返す。
             *  何らかのエラーが派生した場合は、nullの2次元配列を返す。
             *  
             *  【注意】
             *    ①戻り値の添え字は1始まり <---(゚ロ゚)!!! 
             *    ②2次元配列は参照渡しとなるので、戻り値はローカルの2次元配列に即コピーのこと。
             *     Arrry.Copyでコピー後の配列は、0始まりとなる。
             *  
             *************************************************************************************/

            Console.WriteLine("fullPath :" + fullPath);
            Console.WriteLine("sheetName:" + sheetName);

            errMsg = ""; //リセット
            object[,] rangeArray;
            object[,] nullArray = null;  //エラー時用


            //フルパスで指定されたエクセルファイルが存在するか確認---------------------------------
            if (System.IO.File.Exists(fullPath))    //ファイル存在チェック
            {
                //存在する ⇒ OK
            }
            else
            {
                //存在しない ⇒ おしまい
                rangeArray = nullArray;             //nullの2次元配列を代入
                errMsg += "フルパスで指定されたエクセルファイルが存在しません。";
                Console.WriteLine("フルパスで指定されたエクセルファイルが存在しません。");
                return rangeArray;
            }


            //エクセルファイル読み込み-------------------------------------------------------------
            var excelApplication = new Microsoft.Office.Interop.Excel.Application();
            try
            {
                Workbooks workbooks = excelApplication.Workbooks;
                try
                {
                    Workbook workbook = workbooks.Open(fullPath);
                    try
                    {
                        Sheets worksheets = workbook.Sheets;
                        try
                        {
                            Worksheet worksheet = worksheets[sheetName];
                            try
                            {
                                // 使用範囲を一括で二次元配列にコピー
                                Range usedRange = worksheet.UsedRange;
                                try
                                {
                                    rangeArray = usedRange.Value;
                                }
                                finally { Marshal.ReleaseComObject(usedRange); }

                                // 二次元配列に対してループを回す
                                int lastRow = rangeArray.GetLength(0);
                                int lastCol = rangeArray.GetLength(1);
                                Console.WriteLine("lastRow:" + lastRow);
                                Console.WriteLine("lastCol:" + lastCol);
                                //for (int i = 1; i < lastRow; i++)
                                //{
                                //    Console.WriteLine(rangeArray[i, 1]);
                                //}
                            }
                            finally { Marshal.ReleaseComObject(worksheet); }
                        }
                        catch (Exception e)
                        {
                            rangeArray = nullArray;
                            errMsg += "シート名エラー";
                            Console.WriteLine("シート名エラー e:" + e.ToString());
                        }
                        finally { Marshal.ReleaseComObject(worksheets); }
                    }
                    finally
                    {
                        if (workbook != null)
                        {
                            workbook.Close(false);
                        }
                        Marshal.ReleaseComObject(workbook);
                    }
                }
                catch (Exception e)
                {
                    rangeArray = nullArray;
                    errMsg += "ファイルを開くことができませんでした。";
                    Console.WriteLine("ファイルを開くことができませんでした。 e:" + e.ToString());
                }
                finally { Marshal.ReleaseComObject(workbooks); }
            }
            finally
            {
                if (excelApplication != null)
                {
                    excelApplication.Quit();
                }
                Marshal.ReleaseComObject(excelApplication);
            }
            return rangeArray;
        }

85-3.CSVファイル操作

あんまり使わないかもだけど備忘として。

C#
        public string _AppendOneLineToLast(string fullPath, string header, string line)
        {
            /*-------------------------------------------------------------------------------------
             * 【処理】
             *  指定したファイル(fullPath)がある場合:
             *      ⇒最終行に指定文字(line)を追記する。
             *  指定したファイルが無い場合:
             *      ⇒1)ファイルを作成し、ヘッダー(header)を書込んだ後、2)最終行に指定文字(line)を追記する。   
             *      
             *  例)
             *   header: "登録日,結果,備考"            
             *   line  :  "2023/05/21 09:04:23,OK,特記なし"
             *  
             ------------------------------------------------------------------------------------*/

            string result = "NG";            
            line += "\r\n"; //改行追加

            //1)ファイルが無い場合、ファイルを作成しヘッダー(header)を書込む 
            if (File.Exists(fullPath))
            {
                //ファイル有り⇒続行
            }
            else
            {
                //ファイル無し⇒ファイルを作成し、ヘッダー(header)を書込む。
                using (StreamWriter swNew = new StreamWriter(fullPath,
                                                            false,  //false:上書き、true:追加
                                                            Encoding.GetEncoding("shift-jis")))
                {
                        swNew.WriteLine(header);
                }
            }

            //2)最終行に指定文字(line)を追記する。
            StreamWriter sw = null;
            try
            {
                sw = new StreamWriter(
                    fullPath,
                    true,
                    System.Text.Encoding.GetEncoding("shift_jis"));

                //書き込む
                sw.Write(line);
                //閉じる
                sw.Close();
                result = "OK";
            }
            catch (Exception e)
            {
                result = "NG:" + e.ToString();
                Console.WriteLine("エラー: " + e.ToString());

            }
            finally
            {
                //閉じる
                if (sw != null) sw.Close();
            }

            return result;
        }

指定日より前の行を削除します。
CSVファイルの1列目に登録日時が格納されている前提です。

C#
        public string _DeleteLinesExcept(string fullPath,string remainDay)
        {
            /*-------------------------------------------------------------------------------------
             *  【処理】
             *  
             *  指定したファイル(fullPath)がある場合、
             *      ⇒残す日(remainDay 例."yyyy/MM/dd")より前のレコードを削除する。
             *      
             *  指定したファイル(fullPath)がない場合、
             *      ⇒スキップ。スキップの場合の戻り値はOK。
             *      
             *  [条件]
             *      ファアイルの1列目に日付が入っていること。 
             *          
             *  例)
             *   remainDay: "2023/08/06"   ←この日より古い行を削除する。    
             *      
             ------------------------------------------------------------------------------------*/

            string result = "NG";

            //ファイル読み込みの定義
            System.IO.StreamReader sr = null;

            //一時ファイルのパス(一旦このファイルに完成形を書込み、最後に元ファイル名にリネームする。) 
            string tmpPath = fullPath.Replace(".csv", "TMP.csv"); 
            //一時ファイル書き込みの定義
            System.IO.StreamWriter sw = null;

            try
            {
                sr = new System.IO.StreamReader(fullPath, Encoding.GetEncoding("shift-jis"));
                sw = new System.IO.StreamWriter(tmpPath, false, Encoding.GetEncoding("shift-jis"));

                bool isFirstLine = true;
                //内容を一行ずつ読み込む
                while (sr.Peek() > -1)
                {
                    //一行読み込む
                    string line = sr.ReadLine();
                    var splitted = line.Split(',');

                    //Console.WriteLine(line);
                    //Console.WriteLine(splitted[0].ToString());

                    //ヘッダー処理(ヘッダーなので残す。)
                    if (isFirstLine == true)
                    {
                        sw.WriteLine(line);     //一時ファイルに書き込む
                        isFirstLine = false;
                        continue;
                    }

                    //レコード処理
                    DateTime 利用日時 = DateTime.Parse(splitted[0].ToString());  //1列目のデータを取りだす。
                    if (利用日時 < DateTime.Parse(remainDay))
                    {
                        //Console.WriteLine("削除");
                    }
                    else
                    {
                        sw.WriteLine(line);     //一時ファイルに書き込む
                        //Console.WriteLine("残");
                    }
                }

                //閉じる
                sr.Close();
                sw.Close();

                //一時ファイルと入れ替える
                System.IO.File.Copy(tmpPath, fullPath, true);
                System.IO.File.Delete(tmpPath);

                result = "OK";
            }
            catch (Exception e)
            {
                //MessageBox.Show("【NG】不要データ削除の削除に失敗しました。\n\n" + e.ToString());
                result = "NG:" + e.ToString();
            }
            finally
            {
                //閉じる
                if (sr != null) sr.Close();
                if (sw != null) sw.Close();
            }

            return result;
        }

85-4.xmlファイル操作

これ便利!

xml
[FileInfo.xml]
<?xml version="1.0" encoding="utf-8" ?> 
<!--"utf-8" 又は"shift_jis"を適宜選択のこと-->
<Data>
  <FileInfo>
      <OriginalFullPath>C:\Users…なんとかかんとか</OriginalFullPath>
      <MonitorPath>\\…なんとかかんとか</MonitorPath>
      <MonitorFile>ファイルネーム</MonitorFile>
  </FileInfo>
</Data>  
C#
        private void XMLファイル読み込み()
        {
            //【前提】実行ファイルと同じフォルダにxmlファイルが存在する。
            //自分自身(実行ファイル)のパスを取得する
            string appPath = System.Windows.Forms.Application.StartupPath;
            //XMLファイルのフルパス作成
            string fullPath = appPath + @"\FileInfo.xml";

            //xmlファイルを指定する
            XElement xml = XElement.Load(fullPath);
            //メンバー情報のタグ内の情報を取得する
            IEnumerable<XElement> infos = from item in xml.Elements("FileInfo") select item;

            //メンバー情報分ループして、コンソールに表示
            foreach (XElement info in infos)
            {
                Console.WriteLine(info.Element("OriginalFullPath").Value);
                Console.WriteLine(info.Element("MonitorPath").Value);
                Console.WriteLine(info.Element("MonitorFile").Value);
            }
        }

90.フォームの表示

モーダル、モードレスの場合

C#
            this.Hide();    //自分を隠す-----------------

            //Formクラスのインスタンスを作成する
            Form名称 f = new Form名称();

            //【モードレス】
            //f.Show();

            //【モーダル】
            f.ShowDialog(this);     //オーナーウィンドウにthisを指定する
            //フォームが必要なくなったところで、Disposeを呼び出す
            f.Dispose();

            this.Show();    //自分を現す------------------

最後.クラス(フォーム)間の値受け渡し

直ぐに忘れるのでメモ、メモ…

①親子関係の無いフォームから親のプロパティを参照する場合(汎用的方法)

親フォーム
//親インスタンスの定義とプロパティ定義
private static FormMain formMainInstance;
//値の設定はFormMain_Loadにて ⇒ FormMain.formMainInstance = this;) 
public static FormMain _FormMainInstance
{
    get { return formMainInstance;}
    private set   { formMainInstance = value; }
}

//プロパティ定義
private string user
public string _User     
{
    get    { return user; }    //値は別途代入
    private set { }                //空白
}

private void FormMain_Load(object sender, EventArgs e)
{
     //インスタンスの代入
     FormMain.formMainInstance = this;
}
モードレス表示フォーム、孫フォーム
string User  = FormMain._FormMainInstance._User;

②モーダル表示された子フォームから親フォームのプロパティを参照する場合のみ

親フォーム
//プロパティ定義
public string pubUser     
{
    get    { return User; }    //値は別途代入
    private set { }                //空白
}
モーダル表示された子フォーム(Form子)
string User = ((Form)this.Owner).pubUser;
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?