6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C# Tips

Last updated at Posted at 2020-11-11

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

###デバッグ

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

イベントを追加する
image.png

キャンセルを許可
image.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

####イベント
image.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

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();

6
8
2

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
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?