SQLの窓

2020年05月02日


C#( Form ) : ウインドウ枠の無い吹き出しの作成

昔 Flex で透明ウィンドウ作った事があったので、C# でもできるだろうと調べてみたら普通にありました。凝っても仕方無いので向きの切り替えとかコンテキストメニュー等は好みで追加すればいいと思います。

オンラインで授業やるのに欲しいなぁと思い作ってみましたので、自分はこれで十分です。

エディタ部分は、richTextEditor です。( 縦スクロールバーが文字列があふれた時に表示されます )
using System;
using System.Drawing;
using System.Windows.Forms;

namespace TransForm
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			// フォームの境界線とタイトルを表示しない
			this.FormBorderStyle = FormBorderStyle.None;
			// 画像サイズ
			this.Size = new Size(584, 396);
			// 画像を読み込む( 吹き出し部分以外青 )
			Bitmap bmp = new Bitmap("fu2.png");
			// 透明にする色
			Color tColor = Color.Blue;
			// 背景画像に指定する
			this.BackgroundImage = bmp;

			// 透明を指定する
			this.TransparencyKey = tColor;

			// ウインドウを richTextBox 以外で移動できるようにする
			this.MouseDown +=
				new MouseEventHandler(Form1_MouseDown);
			this.MouseMove +=
				new MouseEventHandler(Form1_MouseMove);
		}

		// マウスのクリック位置
		private Point mousePoint;

		// マウスのボタンが押された
		private void Form1_MouseDown(object sender, MouseEventArgs e)
		{
			if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
			{
				// 押された位置
				mousePoint = new Point(e.X, e.Y);
			}
		}

		// マウスのドラッグ処理
		private void Form1_MouseMove(object sender,	MouseEventArgs e)
		{
			if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
			{
				this.Left += e.X - mousePoint.X;
				this.Top += e.Y - mousePoint.Y;
			}
		}
	}
}




posted by lightbox at 2020-05-02 18:11 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2020年02月04日


C# のタプル( Visual Studio 2017 でテスト )

System.ValueTuple を NuGet でインストールする必要がありますが、値を集団で容易に扱う事ができます

using System;

// System.ValueTuple を NuGet でインストール
// https://www.nuget.org/packages/System.ValueTuple/
// プロジェクトのプロパティのビルドの詳細設定で最新 C# 言語バージョンに変更
namespace ConsoleApp_003
{
	class Program
	{
		static void Main(string[] args)
		{
			// 無名
			var unnamed = ("one", "two");
			Console.WriteLine($"1: {unnamed.Item1}, 2: {unnamed.Item2}");

			// 左辺でプロパティを定義
			(string Alpha, string Beta) namedLetters = ("one", "two");
			Console.WriteLine($"1: {namedLetters.Alpha}, 2: {namedLetters.Beta}");

			// 右辺でプロパティを定義
			var alphabetStart = (Alpha: "one", Beta: "two");
			Console.WriteLine($"1: {alphabetStart.Alpha}, 2: {alphabetStart.Beta}");

			// 変数でプロパティを定義
			var sum = 12.5;
			var count = 5;
			var accumulation = (count, sum);
			Console.WriteLine($"1: {accumulation.count}, 2: {accumulation.sum}");

			// タプルを戻す関数 ( 1 )
			Console.WriteLine($"1: {testFunc().Item1}, 2: {testFunc().Item2}, 3: {testFunc().Item3}");

			// タプルを戻す関数 ( 2 )
			Console.WriteLine($"1: {testFunc2().a}, 2: {testFunc2().b}, 3: {testFunc2().c}");

			Console.ReadLine();
		}

		// ***********************************
		// タプルを戻す関数 ( 1 )
		// ***********************************
		public static (string, int, double) testFunc()
		{
			return ("a", 1, 5.5);
		}

		// ***********************************
		// タプルを戻す関数 ( 2 )
		// ***********************************
		public static (string a, int b, double c) testFunc2()
		{
			return ("a", 1, 5.5);
		}
	}
}



このページの PDF



posted by lightbox at 2020-02-04 01:19 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2020年01月21日


C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する

▼ NuGet パッケージマネージャコンソールより Json.NET をプロジェクト内にインストール
PM> Install-Package Newtonsoft.Json

'.NETFramework,Version=v4.6.1' を対象とするプロジェクト 'ConsoleApp-002' に関して、パッケージ 'Newtonsoft.Json.12.0.3' の依存関係情報の収集を試行しています
依存関係情報の収集に 17.23 ms かかりました
DependencyBehavior 'Lowest' でパッケージ 'Newtonsoft.Json.12.0.3' の依存関係の解決を試行しています
依存関係情報の解決に 0 ms かかりました
パッケージ 'Newtonsoft.Json.12.0.3' をインストールするアクションを解決しています
パッケージ 'Newtonsoft.Json.12.0.3' をインストールするアクションが解決されました
'nuget.org' からパッケージ 'Newtonsoft.Json 12.0.3' を取得しています。
  GET https://api.nuget.org/v3-flatcontainer/newtonsoft.json/12.0.3/newtonsoft.json.12.0.3.nupkg
  OK https://api.nuget.org/v3-flatcontainer/newtonsoft.json/12.0.3/newtonsoft.json.12.0.3.nupkg 5 ミリ秒
Newtonsoft.Json 12.0.3 をインストールしています。
パッケージ 'Newtonsoft.Json.12.0.3' をフォルダー 'D:\user\cs\cs20\ConsoleApp-002\packages' に追加しています
パッケージ 'Newtonsoft.Json.12.0.3' をフォルダー 'D:\user\cs\cs20\ConsoleApp-002\packages' に追加しました
パッケージ 'Newtonsoft.Json.12.0.3' を 'packages.config' に追加しました
'Newtonsoft.Json 12.0.3' が ConsoleApp-002 に正常にインストールされました
NuGet の操作の実行に 3.54 sec かかりました
経過した時間: 00:00:04.8406552
※ インストール後 Newtonsoft.Json は参照済で、packages フォルダが作成されてインストールされている。 Available NuGet Distribution Versions
using Newtonsoft.Json;
using System;
using System.Net;
using System.Text;

namespace ConsoleApp_002
{
	class Program
	{
		static void Main(string[] args)
		{
			string json_url = "https://lightbox.sakura.ne.jp/demo/template/basic/basic-html/project/basic-01.json";
			WebClient webClient = new WebClient();
			webClient.Encoding = Encoding.GetEncoding("utf-8");
			string json_text = webClient.DownloadString(json_url);

			Console.WriteLine(json_text);

			// JSON 文字列を一括でクラスのオブシェクトに変換
			MyJson data = JsonConvert.DeserializeObject<MyJson>(json_text);

			Console.WriteLine(data.title);
			Console.WriteLine(data.name);
			Console.WriteLine(data.image);
			Console.WriteLine(data.text);

			Console.ReadLine();
		}

		// ******************************************
		// 一括変換用のクラス
		// ******************************************
		private class MyJson
		{
			public string title { get; set; }
			public string name { get; set; }
			public string image { get; set; }
			public string text { get; set; }
		}
	}
}


このページの PDF



posted by lightbox at 2020-01-21 21:30 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2020年01月20日


C# の文法的文字列処理

文字列補間 の $ はとても便利です。$@ で文章をそのまま解りやすく構築できると思います。

また、文字列補完では、空白文字を埋める機能と書式文字列を同時に使用する事ができます。
{<interpolationExpression>[,<alignment>][:<formatString>]}
※ めったに使う事はありませんが、文字列を[] で位置指定して文字( char ) を取得できます。
using System;
using System.IO;

namespace ConsoleApp_001
{
	class Program
	{
		static void Main(string[] args)
		{
			// 実行中ファイルのパス
			string dir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
			Console.WriteLine(dir);

			// 部分文字
			Console.WriteLine(dir[2].GetType());
			Console.WriteLine(dir[2]);

			// 逐語的リテラル文字列
string lines = @"
特殊文字を
直接表現
する方法
";
			Console.WriteLine(lines);

			// 文字列補間
			string lines_copy = $"{lines}";
			Console.WriteLine(lines);

			// 文字列補間 + 逐語的リテラル文字列
lines = $@"
{dir}
C:\user\cs\cs20\ConsoleApp-001
";
			Console.WriteLine(lines);

			// 文字列補間幅指定(指定文字数でどちらかに寄せる)
			string ok = "OK";
			string double_5 = $"|{ok,-5}|{ok,5}|";
			Console.WriteLine(double_5);

			// 文字列補間 カンマ編集
			int num = 1234567890;
			string yen = $"{num,20:#,#}";
			Console.WriteLine(yen);

			// 配列
			string[] abc = { "a", "b", "c" };
			foreach( string val in abc )
			{
				Console.WriteLine(val);
			}

			// 実行停止
			Console.ReadLine();
		}
	}
}


実行結果
D:\user\cs\cs20\ConsoleApp-001\ConsoleApp-001\bin\Debug
System.Char
\

特殊文字を
直接表現
する方法


特殊文字を
直接表現
する方法


D:\user\cs\cs20\ConsoleApp-001\ConsoleApp-001\bin\Debug
C:\user\cs\cs20\ConsoleApp-001

|OK   |   OK|
       1,234,567,890
a
b
c
このページの PDF
posted by lightbox at 2020-01-20 20:44 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2020年01月09日


C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )

スタンダードな C# から ODBC を使用した読み取り処理のテンプレートです。

▼ 以下のようなデータで実行

using System;
using System.Data.Odbc;

namespace MySQL1
{
	class Program
	{
		static void Main(string[] args)
		{
			// *******************************
			// 接続文字列作成
			// *******************************

			// 新しい OdbcConnectionStringBuilder オブジェクトを作成
			OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

			// ドライバ文字列をセット ( 波型括弧{} は必要ありません ) 
			// 文字列を正確に取得するには、レジストリ : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
			builder.Driver = "MySQL ODBC 5.3 Unicode Driver";
			//builder.Driver = "MySQL ODBC 8.0 Unicode Driver";

			// 接続用のパラメータを追加
			builder.Add("server", "localhost");
			builder.Add("database", "lightbox");
			builder.Add("uid", "root");
			builder.Add("pwd", "");

			// 接続文字列の内容を確認
			Console.WriteLine(builder.ConnectionString);

			// 一旦停止
			Console.ReadLine();

			using (OdbcConnection myCon = new OdbcConnection())
			using (OdbcCommand myCommand = new OdbcCommand())
			{

				// *******************************
				// 接続
				// *******************************
				try
				{
					myCon.ConnectionString = builder.ConnectionString;
					myCon.Open();
				}
				catch (OdbcException ex)
				{
					Console.WriteLine("接続エラーです");

					string errorMessages = "";
					int i = 0;

					for (i = 0; i < ex.Errors.Count; i++)
					{
						errorMessages += $"Index #{i.ToString()}\r\nMessage: {ex.Errors[i].Message}\r\nNativeError: {ex.Errors[i].NativeError.ToString()}\r\nSource: {ex.Errors[i].Source}\r\nSQL: {ex.Errors[i].SQLState}\r\n";
					}

					Console.WriteLine(errorMessages);
					// 一旦停止
					Console.ReadLine();

					// アプリケーション終了
					return;
				}

				// *******************************
				// レコードセットを取得する為の SQL
				// ※ DATE_FORMAT は MySQL 用
				// *******************************
				string myQuery = "SELECT 社員マスタ.*,DATE_FORMAT(生年月日,'%Y-%m-%d') as 誕生日 from 社員マスタ";

				// 実行する為に必要な情報をセット
				myCommand.CommandText = myQuery;
				myCommand.Connection = myCon;

				// 実行後にレコードセットを取得する為のオブジェクトを作成
				// ( SQL の実行結果 )
				OdbcDataReader myReader = myCommand.ExecuteReader();

				// *******************************
				// 読み出し
				// Read メソッドは、行が存在する場合は true、
				// それ以外の場合は false を返します
				// *******************************
				while (myReader.Read())
				{
					string result = "";

					// 列定義は文字列
					result += $"{GetValue(myReader, "社員コード")} : ";
					result += $"{GetValue(myReader, "氏名")} : ";

					// 列定義は整数
					result += $"{GetValue(myReader, "給与")} : ";

					// 列定義は日付
					result += $"{GetValue(myReader, "作成日")} : ";
					result += $"{GetValue(myReader, "更新日")} : ";
					result += $"{GetValue(myReader, "生年月日")} : ";
					result += $"{GetValue(myReader, "誕生日")}";

					// 内容をコンソールに表示
					Console.WriteLine(result);

				}

				// リーダーを閉じる
				myReader.Close();

				// 接続を閉じる
				myCon.Close();
			}
			// 接続の終わり

			// 一旦停止
			Console.ReadLine();


		}

		// ********************************************************
		// 列データ取得
		//
		// 列データを文字列として取得しますが、NULL の場合は
		// 空文字列を返します
		// ********************************************************
		static string GetValue(OdbcDataReader myReader, string strName)
		{

			string ret = "";
			int fld = 0;

			// 指定された列名より、テーブル内での定義順序番号を取得
			fld = myReader.GetOrdinal(strName);
			// 定義順序番号より、NULL かどうかをチェック
			if (myReader.IsDBNull(fld))
			{
				ret = "";
			}
			else
			{
				// NULL でなければ内容をオブジェクトとして取りだして文字列化する
				ret = myReader.GetValue(fld).ToString();
			}

			// 列の値を返す
			return ret;

		}
	}
}


実行結果




関連する Microsoft ドキュメント

OdbcConnectionStringBuilder クラス
OdbcConnection クラス
OdbcCommand クラス
OdbcDataReader クラス



このページの PDF


posted by lightbox at 2020-01-09 14:19 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2019年12月29日


C# : Excel を データベースとして DataGridView に読み込む

syain.xlsx

※ Microsoft Office の Excel がインストールされている必要はありません

Microsoft.ACE.OLEDB.12.0 を使用して、OleDbConnection と OleDbCommand でデータベースとして処理します。テーブル名としては、シート名が使われますが、範囲指定して名前を定義しない限りは [シート名$] をテーブル名として使用します。( カギかっこは、Oracle で言うところのダブルクォートです )

※ ここでは : select * from [sheet1$]

Microsoft.ACE.OLEDB.12.0 がインストールされていない場合

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードしてインストールします。


( 32ビット版と64ビット版があるので選択してダウンロードします / ※ システム要件に 『32 ビット版の Access データベース エンジンは、Windows XP Service Pack 3 でしか使用できません』とあります。Windows7 では既にインストールされていると思われます )

▼ ダウンロードページの『インストール方法』より抜粋
OLEDB を使用するアプリケーション開発者: ConnectionString プロパティのプロバイダー引数を "Microsoft.ACE.OLEDB.12.0" に設定します。 

Microsoft Office Excel データに接続する場合は、Excel ファイル形式に基づいて OLEDB 接続文字列の適切な拡張プロパティを追加します 

ファイル形式 (拡張子)                                             拡張プロパティ
---------------------------------------------------------------------------------------------
Excel 97-2003 ブック (.xls)                                  "Excel 8.0"
Excel 2007-2010 ブック (.xlsx)                             "Excel 12.0 Xml"
Excel 2007-2010 マクロ有効ブック (.xlsm)      "Excel 12.0 Macro"
Excel 2007-2010 XML 以外のバイナリ ブック (.xlsb)      "Excel 12.0"
処理コード
using System;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Windows.Forms;

namespace ExcelDataGridView
{
	public partial class FormExcelGridView : Form
	{

		private string path = null;

		public FormExcelGridView()
		{
			InitializeComponent();
		}

		private void loadExcelButton_Click(object sender, EventArgs e)
		{
			path = Helper.OpenFileDialog();
			if (path == null)
			{
				return;
			}

			LoadExcel();
		}

		// *********************
		// Excel の読み込み
		// *********************
		private void LoadExcel()
		{

			using (OleDbConnection myCon = new OleDbConnection())
			using (OleDbCommand myCommand = new OleDbCommand())
			{

				// SQL文字列格納用
				string myQuery = "select * from [sheet1$]";

				// 接続文字列の作成
				myCon.ConnectionString = string.Format($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"");
				Debug.WriteLine(myCon.ConnectionString);

				// *********************
				// 接続
				// *********************
				try
				{
					// 接続文字列を使用して接続
					myCon.Open();
					// コマンドオブジェクトに接続をセット
					myCommand.Connection = myCon;
					// コマンドを通常 SQL用に変更
					myCommand.CommandType = System.Data.CommandType.Text;
				}
				catch (Exception ex)
				{
					MessageBox.Show(this, ex.Message);
					return;
				}

				// *********************
				// 実行 SQL
				// *********************
				myCommand.CommandText = myQuery;

				// *********************
				// レコードセット取得
				// *********************
				try
				{
					using (OleDbDataReader myReader = myCommand.ExecuteReader())
					{

						DataTable dataTable = new DataTable();
						dataTable.Load(myReader);
						dataGridView.DataSource = dataTable;

						// リーダを使い終わったので閉じる
						myReader.Close();
					}
				}
				catch (Exception ex)
				{
					myCon.Close();
					MessageBox.Show(this, ex.Message);
					return;
				}

				// 接続解除
				myCon.Close();

			}   // 最外の using の終わり

			// カラム幅の自動調整
			dataGridView.AutoResizeColumns();

		}
	}
}



Helpre クラス



class Helper {

	// https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel
	public const int xlMaximized = -4137;
	public const int xlMinimized = -4140;
	public const int xlNormal = -4143;

	public static string OpenFileDialog() {

		OpenFileDialog ofd = new OpenFileDialog();

		ofd.Filter = "Excel(*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|すべてのファイル(*.*)|*.*";
		ofd.FilterIndex = 1;
		ofd.Title = "Excel ブックを選択してください";
		ofd.RestoreDirectory = true;

		if (ofd.ShowDialog() != DialogResult.OK) {
			return null;
		}

		return ofd.FileName;
	}
}


DataGridView のプロパティ



			// 
			// dataGridView
			// 
			this.dataGridView.AllowUserToAddRows = false;
			this.dataGridView.AllowUserToDeleteRows = false;
			this.dataGridView.AllowUserToOrderColumns = true;
			this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
			this.dataGridView.Location = new System.Drawing.Point(12, 67);
			this.dataGridView.MultiSelect = false;
			this.dataGridView.Name = "dataGridView";
			this.dataGridView.ReadOnly = true;
			this.dataGridView.RowTemplate.Height = 21;
			this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
			this.dataGridView.Size = new System.Drawing.Size(776, 371);
			this.dataGridView.TabIndex = 1;


関連する記事

C# : dynamic 型 による Excel へのアクセス

このページの PDF


posted by lightbox at 2019-12-29 00:12 | VS(C#) | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり