■98288 |
Re[1]: データグリッドビューでクリックだけで複数行選択 |
□投稿者/ 魔界の仮面弁士 -(2021/10/28(Thu) 16:37:57)
| ■No98283 (tosh さん) に返信 > DataGridViewで、Ctrlキーを押さなくてもクリックだけでセルを複数行選択できるようにしたいです。 > この掲示板の過去ログを調べたところ同様の質問があり、回答として > 「DataGridView.WndProcのオーバーライドでCTRLキーが押されているように偽装する」 > の一文と共に、方法が書かれたページのリンクが張ってあったのですが
No87697 のことですね? http://bbs.wankuma.com/index.cgi?mode=al2&namber=87696&KLOG=151
> リンクが切れていたため、具体的な方法がわかりませんでした。 あとは No48251 とか、 No55062 のスレッドとか。 http://bbs.wankuma.com/index.cgi?mode=al2&namber=48214&KLOG=81 http://bbs.wankuma.com/index.cgi?mode=al2&namber=55062&KLOG=92
> 方法が間違っているのだろうと思いますが、どうすれば実現できるでしょうか。 MK_CONTROL → VK_CONTROL とか?
public partial class Form1 : Form { private DataGridView dgv; private DataGridViewRow[] selectedRows = { }; public Form1() { InitializeComponent(); Controls.Add(dgv = new ToshDataGridView { Dock = DockStyle.Fill }); dgv.ColumnCount = 5; dgv.RowCount = 30; } }
public class ToshDataGridView : DataGridView { protected override void WndProc(ref Message m) { const int WM_LBUTTONDOWN = 0x0201; if(m.Msg == WM_LBUTTONDOWN) { ControlKey = true; Application.DoEvents(); base.WndProc(ref m); ControlKey = false; } else { base.WndProc(ref m); } }
private bool ControlKey { set { //const byte MK_CONTROL = 0x08; const byte VK_CONTROL = 0x11; const uint KEYEVENTF_KEYDOWN = 0x0u; const uint KEYEVENTF_KEYUP = 0x2u; const uint KEYEVENTF_EXTENDEDKEY = 0x1u; keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY | (value ? KEYEVENTF_KEYDOWN : KEYEVENTF_KEYUP), UIntPtr.Zero); } } [DllImport("user32.dll")] public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); } |
|