技術メモ

【C#】【VB.NET】電卓アプリのサンプルソースコード提供サービス

概要

Visual Studio2017で作成した、電卓アプリとその全ソースコードをお渡しいたします。(C#またはVB.NETの何れか1つ)
電卓は簡単なように見えて結構複雑な処理を記載しなければならず、初心者にはハードルが高いです。
お渡しするソースコードには、すべてコメントを記載しておりますので、コードの実践的な学習に最適です。 続きを読む 【C#】【VB.NET】電卓アプリのサンプルソースコード提供サービス

【C#】DataGridViewで良く利用する設定たち

設定

//セルをクリックしただけで、入力カーソルを有効にする
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
            
//複数選択不可
dataGridView1.MultiSelect = false;

//セル選択ではなく、行全体選択
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

//一部の列を編集不可にする
dataGridView1.Columns[1].ReadOnly = true;

//ヘッダ列をクリックした際の並び替え禁止
foreach (DataGridViewColumn c in dataGridView1.Columns)
    c.SortMode = DataGridViewColumnSortMode.NotSortable;

//ボタンの背景色が白くなってしまうのを防ぐ
DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
cellStyle.BackColor = SystemColors.Control; //ボタンの標準色を設定
Column3.DefaultCellStyle = cellStyle;

 

値取得

//選択された行のセル値取得
int columnIndex = 0;    //列
int rowIndex = dataGridView1.SelectedCells[0].RowIndex; //選択行
string s = dataGridView1[columnIndex, rowIndex].Value.ToString();   //該当セルの値

 

セルを抜けなくてもCellValueChangedイベントを発生させる

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        //確定させる→セルを抜けなくてもCellValueChangedイベントが発生する
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

 

【VB.NET】スタートアップフォームを変更する

Visual Studioのプロジェクト→プロパティをクリック。

アプリケーションのスタートアップフォームを変更すればOK!

尚、コンストラクタの引数が指定されているフォームはスタートアップフォームのリストに表示されない。

 

【C#】文字列から特定の末尾を除く

以下のようにTrimを使うことで末尾の特定の文字列を除くことができる。

string s = ",a,b,c,";

s = s.Trim(',');    //結果は「a,b,c」

但しこのコードの場合は、文字列の先頭にも特定の文字列が含まれた場合に、それも除かれる。
問題がある場合は、以下のように自力で末尾の文字だけ除けばよい。

string s = ",a,b,c,";

if (s.LastIndexOf(',') == s.Length -1)  //末尾が特定の文字であれば
{
    s = s.Substring(0, s.Length - 1);   //末尾1文字を除く。結果は「,a,b,c」
}

 

【C#】DataTableのSelect高速化

Selectの前に、DefaultView.Sortを呼び出してIndexを作成することで高速化できる。(何度もSelectする状況を想定)

dataTable.DefaultView.Sort = "FIELD_NAME";
dataTable.Select("FIELD_NAME = 'value'");

ちなみに、Selectで指定する値は数値でも文字列でも「’」で囲んでおくのが無難。
エラー内容は忘れたが、数値型の列を数値でSelectしたところ謎の例外エラーが発生して困った際に「’」で囲んだらエラー回避できた・・・

【LINE】「この写真は破損しているため表示できません」と表示され、投稿できない

現象

LINEグループのアルバムに写真を投稿しようとして、写真を選択すると「この写真は破損しているため表示できません」と表示され、投稿できなかった。 続きを読む 【LINE】「この写真は破損しているため表示できません」と表示され、投稿できない

【教訓集】

(随時追記中・・・)

コーディング(共通)

  • 変数名、メソッド名は分かりやすく
  • エラーチェックはメソッドの先頭で行い、エラーがあればその場で適切なメッセージを出し、returnする
  • プログラム自体の戻り値は正常終了した場合は0、それ以外の場合は1以上を返す
  • 長い処理時間が見込まれる場合は、カーソルを砂時計に
    また、await/asyncを利用して応答なし状態にならないようにする。

コーディング(C#、VB.NET)

  • 文字列結合はStringBuilderを使う
  • DataTableを編集する場合は、BeginLoadData、EndLoadDataを使う
  • DataRowを編集する場合は、BeginEdit、EndEditを使う
  • VB.NETで開発するときには、「Option Strict On」「Option Explicit On」を行う
  • VB.NETで開発するときには、namespaceを記述する(名前がかぶってしまうのを防ぐ)
  • VB.NETで開発するときには、Moduleは利用しない。Classを利用する
    (Module内でPublicで宣言してしまうと、どこからも参照可能になりカオスになる)
  • MessageBoxなど、多くの場所で利用する処理は直接呼び出さず、ラッパーを作って利用する。こうすることにより、仕様が変わった際に1か所だけ修正すれば済む、また、ほぼ似てるけど少し違う実装が存在する、などの問題を防げる。

テスト

  • 複数同時アクセス、大量アクセスを試す
  • タブキー押下でのタブ順移動

リリース

  • 不具合改修版をリリースするときには、プログラム入れ替えの他、不具合に起因してDBに保存されたままになっている異常データの修復も忘れない。

タスクスケジューラ

  • ログオンユーザーの違いにより、動作が変わる可能性あり
  • 直接プログラムを呼び出さず、batファイルからプログラム呼び出しを行う。その際にカレントディレクトリを指定する

バッチ

  • 目的、引数の説明などを簡潔にバッチファイルの先頭に記述する

設定変更

  • 本番機でいきなり設定変更しない。本番機に影響の出ない検証機にて、設定変更し、動作確認を行う。また、その設定変更を行う際には手順書を作成して、本番機の設定変更の際に利用する。
  • 設定を変更する際。設定画面の場合は画面キャプチャを、設定ファイルの場合はファイルを取っておく。こうすることで、どこを変えたかが追える。また、バージョンアップした際に、どの部分を変更すればよいかがわかりやすくなる。(設定ファイルの場合はWinMergeなどでDiffを取れるような状態にしておくことが望ましい)

PostgreSQL

  • 1日1回、VACUUM ANALYZEする
  • 月1回、REINDEX、CLUSTERする

運用監視

  • 停電などで機器が本来の手順でシャットダウンされなかった場合、電源を入れなおしても復旧しない場合がある。(UPSの利用)
  • サービスが落ちていないかの監視が必要かを検討する(死活監視)
  • 障害が発生したと同時にメールサーバも落ちてしまい、落ちたことすら分からなくなってしまう、などの事態が発生しないかを考慮する
  • DB、ログサイズの日々の増加量を確認する

役立つ法則