C# Tips

個人的によく使うけど、忘れてしまう処理をメモ書きします。

###デバッグ
```hoge.cs
using System;
using System.Diagnostics;
 
namespace ConsoleApplication1
{
    public class program
    {
        public static void Main(string[] args)
        {
            // デバッグ出力
            Debug.WriteLine("これはデバッグ出力メッセージです。");
 
            // 変数をデバッグ出力することもできる
            Debug.WriteLine("現在時刻：" + DateTime.Now);
        }
    }
}
```

###ラジオボタン
```hoge.cs
if (radioButton1.Checked == true) {
        label1.Text = "radioButton1 がチェックされています。";
      }
      else if (radioButton2.Checked == true) {
        label1.Text = "radioButton2 がチェックされています。";
      }
      else {
        label1.Text = "どちらもチェックされていません。";
      }

```

###リストビュー
####チェックボックスをすべてONとすべてOFF

```hoge.cs

        private void checkbox_on(object sender, EventArgs e)
        {
            for (int i = 0; i < lsv_hoge.Items.Count; i++)
            {
                lsv_hoge.Items[i].Checked = true;
            }

        }
        private void checkbox_off(object sender, EventArgs e)
        {
            for (int i = 0; i < lsv_hoge.Items.Count; i++)
            {
                lsv_hoge.Items[i].Checked = false;
            }

        }

```

####リストビューでチェック（checkBox）された行をすべて取得する

```hoge.cs
            foreach (ListViewItem item in lsv_hoge.CheckedItems)
            {
                Console.WriteLine(item.SubItems[1].Text + "\r\n");
            }
```

###ListViewから選択した項目を取得
```hoge.cs
        #region ListViewから選択した項目を取得
        private void listView_Name_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listView_Name.SelectedItems.Count != 1)
            {
                return;
            }


            // 選択項目を取得する
            ListViewItem itemx = listView_Name.SelectedItems[0];

            MessageBox.Show(itemx.SubItems[0].Text);

        }
        #endregion
```

###リストの追加と出力
リストをループ処理で出し入れするシーンは多いと思う。
ループはforeachではなくforを使う方が処理が速いらしいのここではforを使った例にする

####リストへ入力

```hoge.cs
        private List<string> Read_Excel(string Excel_Path)
        {
            //リストの作成
            List<string> url_list = new List<string>();

            XLWorkbook workbook = new XLWorkbook(Excel_Path);
            IXLWorksheet worksheet = workbook.Worksheet(1);
            int lastRow = worksheet.LastRowUsed().RowNumber();
            for (int i = 1; i <= lastRow; i++)
            {
                IXLCell cell = worksheet.Cell(i, 12);

                //リストへ追加
                url_list.Add(cell.Value.ToString());
                //Console.WriteLine(cell.Value);
            }

            return url_list;
        }
```

####リストから出力
```hoge.cs
            //Excelを読み込む
            List<string> url_list=Read_Excel(filePath);

            for (var i = 0; i < url_list.Count; i++)
            {
                Console.WriteLine(url_list[i]);
            }

```


###DataTableとDataRowの操作

カラムの定義からデータ追加

```hoge.cs
            //https://accelboon.com/tn/c-datarow%E3%81%AE%E9%85%8D%E5%88%97%E3%82%92datatable%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B/

            DataTable dt_csvlist = new DataTable();
            
            DataColumn[] dc_csvlist = {
                new DataColumn("no", typeof(string)),
                new DataColumn("table_name",typeof(string)),
                new DataColumn("table_name_j", typeof(string)),
                new DataColumn("kensu", typeof(string)),
                new DataColumn("syutsu_kensu", typeof(string)),
                new DataColumn("file", typeof(string))
            };

            dt_csvlist.Columns.AddRange(dc_csvlist);

            DataRow dr_csvlist = dt_csvlist.NewRow();

            for (int i = 0; i < is_Csv.Length; i++)
            {
                string ls_TABLE_NAME = Get_TableName(is_Csv[i]);
                if (ls_TABLE_NAME == "")
                {
                    ls_TABLE_NAME = is_Table[i];
                }

                string ls_TABLE_NAME_J = Get_TableJName(ls_TABLE_NAME);

                dr_csvlist = dt_csvlist.NewRow();
                dr_csvlist["no"] = (i + 1).ToString("##0");
                dr_csvlist["table_name"] = ls_TABLE_NAME;
                dr_csvlist["table_name_j"] = ls_TABLE_NAME_J;
                dr_csvlist["kensu"] = "";
                dr_csvlist["syutsu_kensu"] = "0";
                dr_csvlist["file"] = is_Csv[i];
                dt_csvlist.Rows.Add(dr_csvlist);

            }

```

DataTableからデータの取り出し

```hoge.cs

string ls_CsvName = dt_csvlist.Rows[Table_No].Field<string>("file").Replace(".csv", "").Replace(".CSV", "");

string ls_TableName = dt_csvlist.Rows[Table_No].Field<string>("table_name");
```


###構造体

```hoge.cs
        public void hoge()
        {
            Struct_formitem S_formitem;

                //画像
                S_formitem.item_img = "";
                //商品名
                S_formitem.item_name = "";
                //カテゴリ
                S_formitem.item_cate = "";

                //商品の状態
                S_formitem.item_state = "";

                //説明
                S_formitem.item_setsumei = "";

                //個数
                S_formitem.item_su = "";

                //発送元の地域
                S_formitem.item_area = "";
        }

        //商品登録用構造体
        struct Struct_formitem
        {
            //画像
            public string item_img;
            //商品名
            public string item_name;
            //カテゴリ
            public string item_cate;

            //商品の状態
            public string item_state;

            //説明
            public string item_setsumei;

            //個数
            public string item_su;

            //発送元の地域
            public string item_area;
      }

```

##外部ファイル
###フォルダ配下のファイル名を取得する
```hoge.cs
 #region csvのファイル名を取得する処理
        private void read_fileName()
        {
            //フォルダ配下のcsvファイルをすべて取得する
            string[] files = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\Data", "*.csv", System.IO.SearchOption.AllDirectories);

            //ListBox1に結果を表示する
            //Console.WriteLine(files);

            foreach (string file in files)
            {
                string[] file_path = file.Split('\\');
                int path_count = file_path.Length - 1;
                string file_name = file_path[path_count];

                listView_Name.Items.Add(file_name);
            }
        }
        #endregion
```

###フォルダ・ファイルの存在確認、ディレクトリ（フォルダ）フォルダの作成
```hoge.cs
            //ファイルが存在するとき
            if (System.IO.File.Exists(path))
            {

            }

            //フォルダの存在確認
            if (Directory.Exists(path))
            {

            }

            //フォルダを作成
            Directory.CreateDirectory(images_path);
```

###CSVインポート
```hoge.cs
 // 読み込みたいCSVファイルのパスを指定して開く
            StreamReader sr = new StreamReader(@filename);

            // 末尾まで繰り返す
            while (!sr.EndOfStream)
            {
                // CSVファイルの一行を読み込む
                string line = sr.ReadLine();

                //カンマで文字列分割
                string[] csvdata = line.Split(',');

                //データ入力チェック
                if (csv_data_check(csvdata) == true)
                {
                    //isCheckedの値がtrueだった時の処理
                    MessageBox.Show(err_record + Environment.NewLine + err_field);

                    //ファイルをクローズ
                    sr.Close();
                    OLE_Close();
                    return;
                }
                //データチェックが終わったらテーブルへインサート処理
                CsvToSII();
            }
```
###CsvHelperを使ったインポート方法
色々なCSVタイプに対応してインポートさせるためにはCsvHelperを使うのが楽

```hoge.cs

        public void read_csv(ChromeDriver driver)
        {
           // CSVファイルのパス
           string csvPath=Directory.GetCurrentDirectory() + @"\hoge.csv";

            using (var reader = new StreamReader(csvPath, Encoding.GetEncoding("SHIFT_JIS")))
            using (var csv = new CsvHelper.CsvReader(reader, new CultureInfo("ja-JP", false)))
            {
                var config = csv.Configuration;
                config.HasHeaderRecord = true; // ヘッダーが存在する場合 true
                config.RegisterClassMap<MyClassMap>();
                var list = csv.GetRecords<MyFeilds>();

                foreach (var n in list)
                {
                    toroku_form(driver, n);
                    //MessageBox.Show($"{n.item_name}, {n.item_cate}");
                }

            }
        }

       //商品登録用構造体
        public class MyFeilds
        {
            //画像
            public string item_img { get; set; }
            //商品名
            public string item_name { get; set; }
            //カテゴリ
            public string item_cate { get; set; }

            //商品の状態
            public string item_state { get; set; }

            //説明
            public string item_setsumei { get; set; }

            //個数
            public string item_su { get; set; }

            //発送元の地域
            public string item_area { get; set; }
        }
            public MyClassMap()
            {
                //画像
                Map(m => m.item_img).Index(10);
                //商品名
                Map(m => m.item_name).Index(2);
                //カテゴリ
                Map(m => m.item_cate).Index(1);

                //商品の状態
                Map(m => m.item_state).Index(33);

                //説明
                Map(m => m.item_setsumei).Index(3);

            }
        }
private void toroku_form(ChromeDriver driver, MyFeilds n)
        {
            //商品名
            driver.FindElement(By.Id("fleaTitleForm")).SendKeys(n.item_name);

           
            //説明
            element = driver.FindElement(By.Name("Description_plain_work"));
            element.SendKeys(n.item_setsumei);
        }

```

CSVを読み込んでListViewへ追加（ヘッドレス：csvhelper)

```hoge.cs
  #region csvを読み込む処理
        private void read_csv(string file_path)
        {
                var records = new List<Csv>();

            var config = new CsvConfiguration(new CultureInfo("ja-JP", false))
            {
                HasHeaderRecord = false,
                HeaderValidated = null,
                MissingFieldFound = null
            };


            //read
            using (var reader = new StreamReader(file_path, Encoding.GetEncoding("utf-8")))
            using (var csv = new CsvReader(reader, config))
            {
                csv.Context.RegisterClassMap<CsvMap>();

                records = csv.GetRecords<Csv>().ToList();

            }

            foreach (var i in records)
            {
                if (i.Name0 == "Account" || i.Name0 == "User")
                {
                    //Console.WriteLine(i.Name0);
                    string[] csvdata = {
                                        i.Name0,
                                        i.Name1,
                                        i.Name2,
                                        i.Name3,
                                        i.Name4
                        };
                    listView_Contents.Items.Add(new ListViewItem(csvdata));
                }
            }
        }

        public class Csv
        {
            public string Name0 { get; set; }
            public string Name1 { get; set; }
            public string Name2 { get; set; }
            public string Name3 { get; set; }
            public string Name4 { get; set; }
        }
        public sealed class CsvMap : ClassMap<Csv>
        {
            public CsvMap()
            {
                Map(m => m.Name0).Index(0);
                Map(m => m.Name1).Index(1);
                Map(m => m.Name2).Index(2);
                Map(m => m.Name3).Index(3);
                Map(m => m.Name4).Index(4);
            }
        }

        #endregion
```

###CSV出力
```hoge.cs
using System.IO;

            StringBuilder lstb_csv = new StringBuilder();
            for (int LL=0;LL<lsv_Gzmzai.Items.Count;LL++)
            {
                for (int CC = 0; CC < lsv_Gzmzai.Items[LL].SubItems.Count;CC++)
                {
                    lstb_csv.Append(lsv_Gzmzai.Items[LL].SubItems[CC].Text);
                    lstb_csv.Append(",");
                }
                lstb_csv.Append("\r\n");
            }
            Clipboard.SetDataObject(lstb_csv.ToString(), false);


            //デスクトップパス
            string desktopDirectoryPath =Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

            StreamWriter CsvWriter = new StreamWriter(desktopDirectoryPath+@"\test.csv", false, Encoding.GetEncoding("shift-jis"));
            CsvWriter.Write(lstb_csv.ToString());
            CsvWriter.Close();

```

###クリップボードに保存
```hoge.cs
        public void crip()
        {         
            //クリップボードに保存
            StringBuilder lstb_csv = new StringBuilder();
            for (int LL = 0; LL < lsv_data.Items.Count; LL++)
            {
                //2番目の項目から取得
                for (int CC = 1; CC < lsv_data.Columns.Count - 1; CC++)
                {
                    lstb_csv.Append(lsv_data.Items[LL].SubItems[CC].ToString());
                    lstb_csv.Append("\t");
                    
                }
                lstb_csv.Append("\r\n");
            }
            Clipboard.SetDataObject(lstb_csv.ToString(), false);
        }

```

###カレントディレクトリ・デスクトップパス
```hoge.cs
using System.IO;

//カレントディレクトリ
string path= Directory.GetCurrentDirectory();

//デスクトップ
string desktopDirectoryPath =
 Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

```

###データベースから取得してコンボボックスに表示

```hoge.cs
//コネクションオープン
            connection.Open();

            using (var transaction = connection.BeginTransaction())
            {
                using (SQLiteCommand cmd = connection.CreateCommand())
                {
                    string sql = $@"
                               select yoku_id,yoku_pass from yoku_id 
                    ";

                    try
                    {
                        cmd.CommandText = sql;

                        using (SQLiteDataReader dr = cmd.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                //コンボボックスにアイテムを追加する
                                cb_yahooid.Items.Add(dr["yoku_id"].ToString());
                            }

                            //コンボボックスの表示設定
                            cb_yahooid.SelectedIndex = 0;
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("エラー発生！");
                        return;
                    }
                    transaction.Commit();
                }
            }

            //コネクションクローズ
            connection.Close();

```
###DBからDataGridViewへ
```hoge.cs
       #region 現在のDBデータをdataGridViewへ読み込む
        private void Nowdata_Read()
        {
            //コネクションオープン
            connection.Open();

            //空のテーブルを作ります。
            //この時点では、DataGridViewと紐づいていません。
            this.datatable = new DataTable();

            //DataTableに読み込むデータをSQLで指定します。
            //今回はDataTableを指定していないので、SELECTで表示する列名が
            //のちのち紐づけを行った際のDataGridViewの列名になります。
            SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM yoku_listdata;", connection);
            adapter.Fill(this.datatable);

            //データテーブルをDataGridViewに紐づけます。
            this.dataGridView1.DataSource = this.datatable;

            //データを読み込みます
            //this.DataRead();
        }
        #endregion
```

###ボタンクリックして並列処理を実行する
スクレイピングなどの処理が長いプログラムを実行する場合は、BackgroudWorkerを使うのが一般的。

フォームにBackgroudWorkerを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/4569ca2a-7440-22cf-d4f1-5e9f65c592f7.png)

イベントを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/bfddcbea-7dc6-bc4f-7cf6-6fe9c6e5f094.png)

キャンセルを許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/7dcc7b00-1585-6c2a-2377-84cf63fe4565.png)


```hoge.cs
        #region データ取得ボタンクリック
        private void button1_Click(object sender, EventArgs e)
        {
            // BackgroundWorkerが処理中でないことを確認
            if (MainBackgroundWorker.IsBusy)
            {
                MessageBox.Show("実行中です");
                return;
            }
            // 並列処理を開始する 
            MainBackgroundWorker.RunWorkerAsync();
        }
        #endregion

       #region  並列処理実行処理
        private void OnDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            //実行内容
        }
        #endregion
        #region 並列処理終了処理
        private void OnRunWorkerComleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            txt_status.Visible = false;
            MessageBox.Show("終了しました");
        }
        #endregion

```
参考：https://www.tetsuyanbo.net/tetsuyanblog/30437

###並列処理（BackgroudWork)を中止する
事前にWorkerSupportsCancellation を true　にしておく

```hoge.cs

        #region stopボタンクリック
        private void button2_Click(object sender, EventArgs e)
        {
            // BackgroundWorkerが処理中の時だけ実行
            if (MainBackgroundWorker.IsBusy)
            {
                // 処理をキャンセルします
                MainBackgroundWorker.CancelAsync();
            }
        }
        #endregion

       #region  並列処理実行処理
           private void OnDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {
                for (int i = 0; i < 1000; i++)
                {
                    // ループ処理の途中にキャンセルされたかを確認する
                    if (MainBackgroundWorker.CancellationPending)
                    {
                        //キャンセルされてた場合の処理
                        e.Cancel = true;
                        return;
                    }
                    //実行処理
                }
        #endregion

       #region 並列処理終了処理
        private void OnRunWorkerComleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                MessageBox.Show("処理はキャンセルされました");
            }
            else
            {
                MessageBox.Show("処理完了");
            }

            txt_status.Visible = false;
        }
        #endregion


```
###並列処理中にフォームを操作する
並列処理中にはフォームへのアクセスしようとするとエラーになります

```hoge.cs
         #region  並列処理実行処理
           private void OnDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {
            // マルチスレット対応してテキストボックスを操作
            Invoke(new Action(status_close));

            // (引数あり）マルチスレット対応してテキストボックスを操作
            Invoke(new Action<string>(status_mess), "開始しました");
            }
        #endregion

        public void  status_mess(string mess)
        {
            txt_status.Text = mess;
        }
        public void status_close()
        {
            txt_status.Visible = false;
        }
```

###メッセージボックス分岐
```hoge.cs
DialogResult result = MessageBox.Show("よろしいですか？", "", MessageBoxButtons.YesNo);
if(result == DialogResult.Yes)
{
MessageBox.Show("かんたんC#");
}
```

###テキストファイル出力

```hoge.cs
using System.IO;
using (StreamWriter sw = new StreamWriter(@"D:\test\hironimo.txt",false, Encoding.UTF8))
{
    sw.WriteLine("おはよう");
    sw.WriteLine("こんにちは");
    sw.WriteLine("こんばんは");
}
```

###ドラッグ＆ドロップの操作

####プロパティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/51127bb7-f86d-cb14-c235-1f34e9ef49a8.png)



####イベント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/9827716a-5f68-ccbc-8534-9d9224c7ac3b.png)


```hoge.cs
 private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            // ファイルが渡されていなければ、何もしない
            if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return;

            // 渡されたファイルに対して処理を行う
            string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop,false);

            // 最初のファイルを取得する
            string filePath = filePaths[0];
        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.All;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
```

###Excel読み書き
[プロジェクト]-[NuGetパッケージの管理]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/9b92f69e-6bbc-e46a-cb6a-08f237280ace.png)

```hoge.cs
using ClosedXML.Excel;


 #region エクセルを読み込んでURLをリストへ戻す
        private List<string> Read_Excel(string Excel_Path)
        {
            //リストの作成
            List<string> url_list = new List<string>();

            XLWorkbook workbook = new XLWorkbook(Excel_Path);
            IXLWorksheet worksheet = workbook.Worksheet(1);
            int lastRow = worksheet.LastRowUsed().RowNumber();

            //2行目から取得するのでi=2
            for (int i = 2; i <= lastRow; i++)
            {
                IXLCell cell = worksheet.Cell(i, 12);

                //リストへ追加
                url_list.Add(cell.Value.ToString());
                //Console.WriteLine(cell.Value);
            }

            return url_list;
        }
 #endregion

#region 該当のURLからデータを取得してエクセルに書き込む
        private void Write_Excel(string Excel_Path)
        {
            //Excelを開く
            XLWorkbook workbook = new XLWorkbook(Excel_Path);
            IXLWorksheet worksheet = workbook.Worksheet(1);
            
            int lastRow = worksheet.LastRowUsed().RowNumber();
            for (int i = 1; i <= lastRow; i++)
            {
                //IXLCell cell = worksheet.Cell(i, 12);
                worksheet.Cell(i, 13).Value = i;
　　　　　　　　　worksheet.Cell(i, 16).Style.Fill.BackgroundColor = XLColor.Red;
            }

            //上書き保存
            workbook.Save();
        }
#endregion


```

###Enterキーでフォーカスを移動させる

KeyDownイベントに設定する

```hoge.cs
        private void txt_SearchString2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                bool forward = e.Modifiers != Keys.Shift;
                //this.ProcessTabKey(forward);
                this.SelectNextControl(this.ActiveControl, forward, true, true, true);
                e.Handled = true;
            }
        }

```
###カンマ区切りを配列にいれてforeachで回す

```hoge.cs
        var c1 = "100,200,300";
        var ar1 = c1.Split(',');

        foreach (string s in ar1)
        {
            Console.WriteLine(s);// 赤 黄 青
        }

```
###配列をループで回してリストへ追加
```hoge.cs
            //画像用フォルダ配下のjpgファイルをすべて取得する
            imgfiles = Directory.GetFiles(images_path, "*.jpg", SearchOption.AllDirectories);

            //リストを作成
            var imglist = new List<string>();

            foreach (string imgfile in imgfiles)
            {

                string imgfilekey = "";

                imgfilekey= imgfile.Split('-')[0];
                imgfilekey = imgfilekey.Replace(images_path+@"\", "").Replace(" ","");

                //画像配列を画像リストの中に追加
                imglist.Add(imgfilekey);
            }
```

###リストを配列へ変換
```hoge.cs

string[] arrayimglist = imglist.ToArray();

```