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

概要

Visual Studio2022(Windowsフォーム)で作成した、電卓アプリとその全ソースコードをお渡しいたします。
電卓は簡単なように見えますが、実際には複雑な処理を記載しなければならず、初心者にはハードルが高いです。
お渡しするソースコードには、すべてコメントを記載しておりますので、コードの実践的な学習に最適です。

実現している機能

  • 四則演算(足し算、引き算、掛け算、割り算)
  • 小数点を含む数値
  • マイナス値
  • テンキーからの操作(数字キー、演算子含む)
  • Cボタン(左辺、演算子、右辺のすべての入力値を消す)
  • CEボタン(現在入力中の値を消す)
  • 整数部の3桁区切り(123,456.789 形式で表示)
  • Ctrl+Cによる画面に表示されている内容をクリップボードへコピー
  • Ctrl+Vによるクリップボードの内容を画面に貼り付け
  • 履歴表示機能

注意事項

プログラミング(コーディング)入門者向けのサンプルソースになります。ご購入頂いた個人でのご利用は問題ありませんが、第三者への公開は不可となります。また、著作権は譲渡いたしません。

お渡しするソースコードは以下の何れか1つになります。サービスご購入後、どれをご希望かをメッセージで教えてください。
①C# + .NET 6
②C# + .NET Framework 4.8
③VB.NET + .NET 6
④VB.NET + .NET Framework 4.8

お試し動作確認

お渡しするソースから作成したEXEはこちらからお試しダウンロードできます
※ダウンロード後、Zipファイルを解凍する前に、ファイルを右クリック→全般タブの一番下のセキュリティの「許可する」にチェックを入れて、「OK」ボタンをクリックした後に、解凍してください。

尚、同じEXEをVectorでも公開しています。

ご購入はこちらからどうぞ

C#、VB.NETの電卓アプリとそのソース渡します 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;

値取得

//選択された行のセル値取得
if (dataGridView1.SelectedCells.Count > 0)
{
    int columnIndex = dataGridView1.SelectedCells[0].ColumnIndex;     //選択列
    int rowIndex = dataGridView1.SelectedCells[0].RowIndex;           //選択行

    string cellValue = "";

    if (dataGridView1[columnIndex, rowIndex].Value != null)
    {
        cellValue = dataGridView1[columnIndex, rowIndex].Value.ToString();   //該当セルの値
    }
}

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

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

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

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

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

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

但しこのコードの場合は、文字列の先頭にも特定の文字列が含まれた場合に、それも除かれてしまう。
そういった可能性が考えられる場合は、TrimEndを利用すればよい。

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

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

 

【C#】DataTableのSelect高速化

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

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

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

【C#】async/awaitを利用したマルチスレッド実装テンプレート

ボタン押下時の処理にて、以下のような要件を想定したサンプルです。
(.NET Framework4.5.1利用)

開始

A処理
↓   ↓
B処理  C処理 ※
↓   ↓
D処理

終了

※ここだけ並行処理可能なので、マルチスレッド化したい。

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AsyncSample
{
    /// <summary>
    /// async/awaitの利用サンプル
    /// </summary>
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// ボタン押下時に並行実行可能な処理をマルチスレッドで実行する
        /// ※private void → private async void に変更
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("最初に行う処理。これが終わるまではMainSampleは呼び出されない。");

            //マルチスレッド処理(awaitを付けて、メソッド内の処理が終わるのを待っている)
            await MainSample();

            Console.WriteLine("最後に行う処理。MainSampleが終わった後に呼び出される。");
        }

        /// <summary>
        /// 並行実行可能な処理
        /// ※private void → private async Task に変更
        /// </summary>
        /// <returns></returns>
        private async Task MainSample()
        {
            //task1の実行を開始
            Task<string> task1 = Dummy(5, "task1");

            //task2の実行を開始
            Task<string> task2 = Dummy(1, "task2");

            //task1とtask2の実行が終わるまで待つ
            await task1;
            await task2;

            //それぞれのtaskの戻り値を取得
            Console.WriteLine("task1の戻り値:" + task1.Result);
            Console.WriteLine("task2の戻り値:" + task2.Result);
        }
        
        /// <summary>
        /// 複数の引数を受け取り、処理結果を戻り値として返す
        /// ※private void → private async Task<string> に変更。戻り値が不要の場合は、private async Task にする。
        /// </summary>
        /// <param name="i"></param>
        /// <param name="s"></param>
        /// <returns></returns>
        private async Task<string> Dummy(int i, string s)
        {
            Console.WriteLine("処理開始:" + i);

            string dummyText = await Task.Run(() =>
            {
                //何らかの重い処理・・・
                System.Threading.Thread.Sleep(1000 * i);
                return s + "の処理完了:" + DateTime.Now.ToString();
            });

            Console.WriteLine("処理完了:" + i);

            return dummyText;
        }
    }
}

実行結果> 続きを読む 【C#】async/awaitを利用したマルチスレッド実装テンプレート