個人的によく使うけど、忘れてしまう処理をメモ書きします。
###デバッグ
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
public class program
{
public static void Main(string[] args)
{
// デバッグ出力
Debug.WriteLine("これはデバッグ出力メッセージです。");
// 変数をデバッグ出力することもできる
Debug.WriteLine("現在時刻:" + DateTime.Now);
}
}
}
###ラジオボタン
if (radioButton1.Checked == true) {
label1.Text = "radioButton1 がチェックされています。";
}
else if (radioButton2.Checked == true) {
label1.Text = "radioButton2 がチェックされています。";
}
else {
label1.Text = "どちらもチェックされていません。";
}
###リストビュー
####チェックボックスをすべてONとすべてOFF
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)された行をすべて取得する
foreach (ListViewItem item in lsv_hoge.CheckedItems)
{
Console.WriteLine(item.SubItems[1].Text + "\r\n");
}
###ListViewから選択した項目を取得
#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を使った例にする
####リストへ入力
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;
}
####リストから出力
//Excelを読み込む
List<string> url_list=Read_Excel(filePath);
for (var i = 0; i < url_list.Count; i++)
{
Console.WriteLine(url_list[i]);
}
###DataTableとDataRowの操作
カラムの定義からデータ追加
//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からデータの取り出し
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");
###構造体
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;
}
##外部ファイル
###フォルダ配下のファイル名を取得する
#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
###フォルダ・ファイルの存在確認、ディレクトリ(フォルダ)フォルダの作成
//ファイルが存在するとき
if (System.IO.File.Exists(path))
{
}
//フォルダの存在確認
if (Directory.Exists(path))
{
}
//フォルダを作成
Directory.CreateDirectory(images_path);
###CSVインポート
// 読み込みたい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を使うのが楽
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)
#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出力
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();
###クリップボードに保存
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);
}
###カレントディレクトリ・デスクトップパス
using System.IO;
//カレントディレクトリ
string path= Directory.GetCurrentDirectory();
//デスクトップ
string desktopDirectoryPath =
Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
###データベースから取得してコンボボックスに表示
//コネクションオープン
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へ
#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を使うのが一般的。
#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 にしておく
#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
###並列処理中にフォームを操作する
並列処理中にはフォームへのアクセスしようとするとエラーになります
#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;
}
###メッセージボックス分岐
DialogResult result = MessageBox.Show("よろしいですか?", "", MessageBoxButtons.YesNo);
if(result == DialogResult.Yes)
{
MessageBox.Show("かんたんC#");
}
###テキストファイル出力
using System.IO;
using (StreamWriter sw = new StreamWriter(@"D:\test\hironimo.txt",false, Encoding.UTF8))
{
sw.WriteLine("おはよう");
sw.WriteLine("こんにちは");
sw.WriteLine("こんばんは");
}
###ドラッグ&ドロップの操作
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パッケージの管理]
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イベントに設定する
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で回す
var c1 = "100,200,300";
var ar1 = c1.Split(',');
foreach (string s in ar1)
{
Console.WriteLine(s);// 赤 黄 青
}
###配列をループで回してリストへ追加
//画像用フォルダ配下の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);
}
###リストを配列へ変換
string[] arrayimglist = imglist.ToArray();





