...Visual Studio 2015\Projects\MyHomePage 用サンプル \Database(Access2)\Database(Access2)\MainForm.cs 1 /* Database(Access) とやりとりするその 2 DataGridView による編集 */ 2015.9.21~9.23 仕様 DataGridView 上でデータのさまざまな直接編集が行えるようにする しかし その際 イリーガルなデータ ( 段位は 4~9 の半角 1 文字 ) は最初から受け付けないようにする レコードの追加 削除を可能にする 編集結果保存終了 編集結果破棄終了の 2 つが選べるようにする 編集列により IME モードの切り替えを自動的に行う using System; using System.Data; using System.Data.OleDb; using System.IO; using System.Windows.Forms; namespace Database_Access2_ public partial class MainForm : Form public MainForm() InitializeComponent(); Saved = true; // 変更があれば false, なければ true DataTable dtbl = new DataTable(); // DataGirdView に表示するデータが入る DataTable OleDbConnection ocon; OleDbDataAdapter oadp; private void MainForm_Load(object sender, EventArgs e) ocon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"" + Path.GetDirectoryName (Application.ExecutablePath) + "\\test2.accdb\""); oadp = new OleDbDataAdapter("SELECT ID, 現役, 氏名, 段位 FROM TestTable ORDER BY ID", ocon); // ID 列は表示しないが こ
...Visual Studio 2015\Projects\MyHomePage 用サンプル \Database(Access2)\Database(Access2)\MainForm.cs 2 れを含めておかないと Database への更新がきかない oadp.fill(dtbl); dgvkishi.datasource = dtbl; dgvkishi.rowheadersvisible = false; // レコードセレクタを表示しない dgvkishi.allowusertoresizerows = false; // 行の高さを変えさせない dgvkishi.columns[0].visible = false; // 1 列目の ID 列は表示しない dgvkishi.columns[3].defaultcellstyle.alignment = DataGridViewContentAlignment.MiddleCenter; // 段位 の表示はセンタリング dgvkishi.columns[1].width = 40; // 列の表示幅を指定 dgvkishi.columns[2].width = 100; dgvkishi.columns[3].width = 40; ((DataGridViewTextBoxColumn)dgvKishi.Columns[3]).MaxInputLength = 1; // 段位 の入力文字数を 1 文字に制限する btnsave.enabled = false; // ImeMode を 氏名 列ではひらがなに あとの列は半角英数モードにする private void dgvkishi_cellenter(object sender, DataGridViewCellEventArgs e) dgvkishi.imemode = e.columnindex == 2? ImeMode.Hiragana : ImeMode.Disable; // 段位 列は半角数字の 4~9 しか入力できないようにする private void dgvkishi_editingcontrolshowing(object sender, DataGridViewEditingControlShowingEventArgs e) if (e.control is DataGridViewTextBoxEditingControl) var dgv = (DataGridView)sender; var txt = (DataGridViewTextBoxEditingControl)e.Control; txt.keypress -= new KeyPressEventHandler(dataGridViewTextBox_KeyPress); if (dgv.currentcell.owningcolumn.name == " 段位 ") txt.keypress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress);
...Visual Studio 2015\Projects\MyHomePage 用サンプル \Database(Access2)\Database(Access2)\MainForm.cs 3 private void datagridviewtextbox_keypress(object sender, KeyPressEventArgs e) if (e.keychar < '4' e.keychar > '9') // 4~9 キーでないときははじく e.handled = true; else // 4~9 キーのときは受け入れる // セルの内容に変化があったときは 保存されていない 状態にし 保存終了 ボタンを使用可にする // ただし このイベントは 表示 1 列目の 現役 チェックボックスを変化させ 他のセルに移っていない状態や 表示 3 列目の 段位 テキストボックスで数字だけ入力しても確定 (Enter キー TAB キーなどを押すとか他のセルに移るとか ) していない状態では拾えない private void dgvkishi_cellvaluechanged(object sender, DataGridViewCellEventArgs e) // 現役 チェックボックスに変化があったとき private void dgvkishi_keydown(object sender, KeyEventArgs e) // スペースキーのとき if (dgvkishi.currentcell.columnindex == 1 && e.keycode == Keys.Space) private void dgvkishi_cellcontentclick(object sender, DataGridViewCellEventArgs e) // 現役 チェックボックスがマウスクリックのとき if (dgvkishi.currentcell.columnindex == 1)
...Visual Studio 2015\Projects\MyHomePage 用サンプル \Database(Access2)\Database(Access2)\MainForm.cs 4 // データを 1 件削除 int TargetRowN; // DataGridView 上の削除すべき行番号 private void dgvkishi_cellcontextmenustripneeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e) if (e.columnindex >= 0 && e.rowindex >= 0) // ヘッダ以外なら if (dgvkishi.rows[0].cells["id"].value!= null) // データが 1 件でもあるなら TargetRowN = e.rowindex; e.contextmenustrip = contextmenustrip1; contextmenustrip1.items.clear(); contextmenustrip1.items.add(" このデータを 1 件削除 "); contextmenustrip1.items[0].click += このデータを 1 件削除 ToolStripMenuItem_Click; private void このデータを 1 件削除 ToolStripMenuItem_Click(object sender, EventArgs e) dtbl.select("id = '" + dgvkishi.rows[targetrown].cells["id"].value.tostring() + "'")[0].Delete(); // 保存終了処理 private void btnsave_buttonclick(object sender, EventArgs e).validate(); // 編集を確定する var ocombuild = new OleDbCommandBuilder(oAdp); // DataTable の内容変更をもとの Database に伝えるための CommandBuilder 作成 oadp.update(dtbl); // DataTable の内容で Database を Update する Application.Exit(); // アプリケーションを閉じる // 保存せずに終了処理 private void btnnosave_buttonclick(object sender, EventArgs e)
...Visual Studio 2015\Projects\MyHomePage 用サンプル \Database(Access2)\Database(Access2)\MainForm.cs 5 if (!Saved) if (MessageBox.Show(" データに変更がありましたが 本当に保存せずに終了してよろしいですか?", " 確認 ", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) Application.Exit(); else Application.Exit(); // データベースを最初の状態に戻す private void btninitialize_buttonclick(object sender, EventArgs e) var ocmd = new OleDbCommand("DELETE FROM TestTable", ocon); ocon.open(); ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 羽生善治 ', 9)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 渡辺明 ', 9)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 郷田正隆 ', 9)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 糸谷哲郎 ', 8)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 谷川浩司 ', 9)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 豊島将之 ', 7)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 菅井竜也 ', 6)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (FALSE, ' 大山康晴 ', 9)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (FALSE, ' 内藤國雄 ', 9)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (TRUE, ' 加藤一二三 ', 9)"; ocmd.commandtext = "INSERT INTO TestTable ( 現役, 氏名, 段位 ) VALUES (FALSE, ' 大内延介 ', 9)"; ocon.close(); dtbl.clear();
...Visual Studio 2015\Projects\MyHomePage 用サンプル \Database(Access2)\Database(Access2)\MainForm.cs 6 oadp.fill(dtbl);