connet.lolipop.jp
CRUDソースコード
〚MainForm.cs〛
using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Reflection;

namespace CrudSampleApp
{
    public partial class MainForm : Form
    {
        /** クラスフィールド */
                
        // クラスのインスタンス変数定義
        private Product product; // Product.cs
        private DbManager dbmanager; // DbManager.cs        
        private DataTable dataTbl;        
        private DataGridViewButtonColumn editColumn;    	           	       
        
        // 全レコード数
        private int allRowCount;   	
        
        // コンストラクタ
        public MainForm()
        {    	    
            // フォーム初期化
            InitializeComponent();  	    
            // データロード
            DataLoad();  	      	    
            // コントロールの初期設定
            ControlInit();   		  		    	     	      	        	       	        	      	        	       	    
        }
                    
        // データロード
        private void DataLoad()
        {  
            // DataTableのインスタンス作成
            dataTbl = new DataTable();
            
            // DbManagerクラスメソットからデータテーブルを取得
            dbmanager = new DbManager();
            dataTbl = dbmanager.ConnectDatabase();
             
            // コントロールにレコード数を表示
            allRowCount = dataTbl.Rows.Count;
            allRecCountBox.Text = allRowCount.ToString();
             
            // dgvにデータを表示
            dgv.DataSource = dataTbl;
        }
        
        // 登録のSQLを作成
        private void entry_Click(object sender, EventArgs e)
        {
            if (guidBox.Text != "")
            {
                MessageBox.Show("表示しているデータをクリアして、\n新しいデータを入力して下さい。", "登録", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;
            }                       	    	    
            
            // テキストボックスから登録データを変数に代入
            string nameVal = nameBox.Text;
            string addressVal = addressBox.Text;
            
            // Nameの入力チェック
            if (nameVal == "")	
            {
                MessageBox.Show("Nameの入力が不正です。", "登録", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;	
            }
            else
            {
                DialogResult entMes = MessageBox.Show("表示のデータを登録しますか?。", "登録", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (entMes == DialogResult.Yes)
                {
                    // グローバルな一意識別子を生成
                    Guid guid = Guid.NewGuid();                   
                    // 桁区切り無しの文字列に変換
                    string newUniqueId = guid.ToString("N");
                    // タイムスタンプ取得
                    string entryTime = DateTime.Now.ToString();
                                       
                    // テーブル対応のProductクラス - Productr.cs                   
                    // >インスタンスの作成
                    product = new Product();                   
                    // >プロパティに登録データを設定
                    product.Name = nameVal;
                    product.Address = addressVal;                  
                    
                    // 登録SQLの作成 データ処理は「Linq」ライブラリに依存 - 処理に"$"を使用
                    string entrySqlTxt = "INSERT INTO sampletbl(Id, Name, Address, Created_at, Updated_at) VALUES('" + newUniqueId + "', $Name, $Address, '" + entryTime + "','" + entryTime + "')";                  
                    
                    const string entryMes = "登録しました。";
                    
                    // データ登録へ
                    dbmanager.InsertAccess(entrySqlTxt, product, entryMes);
                    
                    // データロード
                    DataLoad();
                    // テキストクリア
                    TextBoxClear();  	    	    
                }
            }
        }//end entry_Click
        
        // 更新のSQLを作成
        private void update_Click(object sender, EventArgs e)
        {
            if (guidBox.Text == "")
            {
                MessageBox.Show("更新するデータをテーブルから選択して下さい!。", "更新", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;
            }
                    
            DialogResult upMes = MessageBox.Show("表示のデータを更新しますか?。", "更新", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (upMes == DialogResult.Yes)
            {
                string guidVal = guidBox.Text;
                string upDateTime = DateTime.Now.ToString(); //現在時刻の取得
                
                // テキストボックスから更新データを変数に代入
                string addressVal = addressBox.Text;
                
                // テーブル対応のProductクラス - Productr.cs              
                // >インスタンスの作成
                product = new Product();               
                // >プロパティに更新データを設定
                product.Address = addressVal;
                              
                // 更新SQLの作成
                string updateSqlTxt = "UPDATE sampletbl SET Address = $Address, Updated_at = '" + upDateTime + "' WHERE Id = '" + guidVal +"'";
                
                const string updateMes = "更新しました。";
                
                // データ更新へ
                dbmanager.UpdateAccess(updateSqlTxt, product, updateMes);
                
                // データロード
                DataLoad();
                // テキストクリア
                TextBoxClear();   	    	
            }
        }//end update_Click
        
        // 削除のSQLを作成
        private void delete_Click(object sender, EventArgs e)
        {
            string guidVal = guidBox.Text; 
            if (guidVal == "")
            {
                MessageBox.Show("削除するデータをテーブルから選択して下さい!。", "削除", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;   	    
            }
            
            DialogResult delMes = MessageBox.Show("表示のデータを削除しますか?。\nId : " + guidVal + "\nName : " + nameBox.Text + "\n" ,"削除", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);   	    
            if (delMes == DialogResult.Yes)
            { 	    	   	    	
                              
                // 削除SQLの作成
                string deleteSqlTxt = "DELETE FROM sampletbl WHERE Id = '" + guidVal + "'";             
                
                const string deleteMes = "削除しました。";
                
                // データ削除へ
                dbmanager.deleteAccess(deleteSqlTxt, deleteMes);
                
                // データロード
                DataLoad();
                // テキストクリア
                TextBoxClear();   	    	
            }
        }//end delete_Click
        
        // テキストボックスクリア
        private void TextBoxClear()
        {
            guidBox.Clear();
            nameBox.Clear();
            addressBox.Clear();
            cleated_atBox.Clear();
            updated_atBox.Clear();
            
            // nameBox編集可能に
            nameBox.ReadOnly = false;
        }
        
        // Clearボタン - テキストボックスクリア
        private void clear_Click(object sender, EventArgs e)
        {			
            TextBoxClear();
        }
                        
        // dgvのレコードをテキストボックスに設定
        private void DgvCellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            // カラムのボタンの確認
            if (dgv.Columns[e.ColumnIndex].Name == "Edit")
            {
                // >>showボタンクリック
                guidBox.Text = dgv.CurrentRow.Cells[1].Value.ToString();
                nameBox.Text = dgv.CurrentRow.Cells[2].Value.ToString();
                addressBox.Text = dgv.CurrentRow.Cells[3].Value.ToString();
                cleated_atBox.Text = dgv.CurrentRow.Cells[4].Value.ToString();
                updated_atBox.Text = dgv.CurrentRow.Cells[5].Value.ToString();
                
                // 編集禁止
                nameBox.ReadOnly = true;
            }
        }
                
      // コントロール初期設定
        private void ControlInit()
        {
            // >>テキストボックス読み取り専用
            guidBox.ReadOnly = true;
            cleated_atBox.ReadOnly = true;
            updated_atBox.ReadOnly = true;
            allRecCountBox.ReadOnly = true;
            
            // dgv
            // >>ちらつき防止で表示高速化
            dgv.GetType().InvokeMember("DoubleBuffered",
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetProperty, null, dgv, new Object[] {true});
            
            // >一番左の列を非表示
            dgv.RowHeadersVisible = false;
            // >>カラム幅
            dgv.Columns["Id"].Width = 140;
            dgv.Columns["Name"].Width = 180;
            dgv.Columns["Address"].Width = 360;
            dgv.Columns["Created_at"].Width = 140;
            dgv.Columns["Updated_at"].Width = 140;    	                
            
            // >>カラムボタン"Edit"を追加
            editColumn = new DataGridViewButtonColumn();
            editColumn.Width = 80;
            editColumn.Name = "Edit";   	      	        	    
            editColumn.Text = "show"; 
            editColumn.UseColumnTextForButtonValue = true;    	   
            dgv.Columns.Add(editColumn);
                    
            // >>カラムヘッダーの背景色の変更
            dgv.EnableHeadersVisualStyles = false;
            dgv.ColumnHeadersDefaultCellStyle.BackColor = Color.CadetBlue;
            // >カラムヘッダーの文字色の変更
            dgv.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;
            // >セルを編集不可に
            dgv.ReadOnly = true;
            
        }//end ControlInit
      
        // アプリケーション終了
        private void exit_Click(object sender, EventArgs e)
        {
            DialogResult confirm = MessageBox.Show("終了していいですか?。", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (confirm == DialogResult.No)
            {
                return;
            }
            this.Close();
        }
    }
}
おわりに
SharpDevelop(IDE)を活用したCRUDの作成についてご紹介しました。
CRUDの基本の一つのユーザー入力の実装においては、2つだけのシンプルなものです。
C#でCRUDにはじめて挑戦したい方の、参考資料の一端とみてください。

当CRUDアプリはWindowsの単独実行型ですが、入力データのSQLインジェクション対策はしましたが、 他に、セキュリティ対策等はしてません、ご承知ください。


次回予定
≫C#とSharpDevelop(IDE)に初めて挑戦したい方に。
▼ 【C#】SharpDevelop(IDE)CRUD+Paging Applicationの作成
参考資料
LINQ クエリの概要 - C# | Microsoft Learn
https://learn.microsoft.com/ja-jp/dotnet/csharp/linq/get-started/introduction-to-linq-queries

SqlCommand.ExecuteNonQuery メソッド
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqlcommand.executenonquery?view=net-9.0-pp

SqlDataAdapter クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqldataadapter?view=netframework-4.8.1

SqliteCommand クラス
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.data.sqlite.sqlitecommand?view=msdata-sqlite-9.0.0

Guid.NewGuid メソッド
https://learn.microsoft.com/ja-jp/dotnet/api/system.guid.newguid?view=net-9.0

DataRow の比較 (LINQ to DataSet)
https://learn.microsoft.com/ja-jp/dotnet/framework/data/adonet/comparing-datarows-linq-to-dataset

DataGridViewコントロール - DoubleBufferedプロパティを有効に描画のちらつき防止対策
Type.InvokeMember メソッド
https://learn.microsoft.com/ja-jp/dotnet/api/system.type.invokemember?view=net-8.0
https://dobon.net/vb/dotnet/control/doublebuffered.html

DataGridViewButtonColumn クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridviewbuttoncolumn?view=windowsdesktop-9.0

Guid.NewGuid メソッド
https://learn.microsoft.com/ja-jp/dotnet/api/system.guid.newguid?view=net-9.0

DataGridViewCellEventArgs.ColumnIndex プロパティ
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.datagridviewcelleventargs.columnindex?view=windowsdesktop-8.0

イベントの処理と発生
https://learn.microsoft.com/ja-jp/dotnet/standard/events/

BindingSource.Filter プロパティ
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.bindingsource.filter?view=windowsdesktop-9.0

Search
Google
⬆ このページの先頭へ