良く使うコード、たまにしか使わないので忘れてしまうコード等を書き留めます。
1.構造体をListにする (配列[]は使えません)
構造体を配列にするには、Listを使うしかないです。
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次元配列のみ。
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.コントロールを静的配列にする
静的なら、これが一番簡単かな?
//テキストボックスの配列を準備する。
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の扱い方
//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
//何処でも書ける定義方法↓
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確認
//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毎にまかせる。
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にログを残す様な場合、新しい行から(下から)指定行残します。
指定行に満たない場合はそのままにします。
private void button1_Click(object sender, EventArgs e)
{
textBox行数制限(textBox1, 100); //100行残したい
}
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; を追記する。
//メディアプレーヤ関連
WMPLib.WindowsMediaPlayer mediaPlayer = new WMPLib.WindowsMediaPlayer();
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でタブ名指定しタブ移動
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.非同期に挑戦
非同期で同じメソッドを複数起動して、全てが終わるまで待つ。
そして、終わったら戻り値を確認する。
これでいいのかな…?
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("↑↑↑非同期処理()が終了しました。↑↑↑");
}
class ClassBigProcess
{
public async Task<string> _膨大処理(int MSec, int ID)
{
//指定ミリ秒停止する
await Task.Delay(MSec);
Console.WriteLine("Delay:" + MSec.ToString() + "ミリ秒間停止しました。");
//エラーは無いと思うので、OKを返す
return "OK:" + ID;
}
}
↓↓↓非同期処理()に入りました。↓↓↓↓
Delay:500ミリ秒間停止しました。
Delay:1500ミリ秒間停止しました。
Delay:2000ミリ秒間停止しました。
taskA:OK:196
taskB:OK:267
taskC:OK:101
↑↑↑非同期処理()が終了しました。↑↑↑
80.--- DB操作/SQLServer ---
80-0.DB接続文字列
DB接続文字列 = @"Data Source=サーバのホスト名 or サーバのIPアドレス;
Initial Catalog=データベース名;
User Id=ユーザ名;
Password=パスワード;";
80-1.Select
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
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
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に戻すのがこれ↓
DateTime tmp = DateTime.FromOADate(double.Parse(values[1, k].ToString()));
85-2.エクセル操作(Sheetまるごと)
アンマネージドのCOMの「Microsoft.Office.Interop.Excel」を使って…
Sheetを2次元配列にセットして戻すメソッド。
【超重要】
但し、usedRangeメソッドを使うので、「書式変更あり&値無し」のセルも利用範囲(Range)として切り取ってしまう。
後処理で注意要!
//引数設定
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);
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ファイル操作
あんまり使わないかもだけど備忘として。
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列目に登録日時が格納されている前提です。
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ファイル操作
これ便利!
[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>
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.フォームの表示
モーダル、モードレスの場合
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 { } //空白
}
string User = ((Form親)this.Owner).pubUser;