Datagridviewから継承するコントロールの1つに、いくつかのドラッグドロップ機能を実装しています。基本的に、DGVのどこかから行をドラッグして別の場所にドロップし、行を並べ替えています。しかし、私は問題に遭遇しました。 DGVが大きすぎてスクロールバーが表示されない場合、ユーザーがドラッグドロップの途中でDGVを上下にスクロールさせるにはどうすればよいですか?
現在のマウスの位置を取得する方法と、dgv長方形などの位置を取得する方法を知っています。だから、私が長方形の上半分にいるのか下半分にいるのかを簡単に見つけることができます...プログラムでdgvをスクロールする方法が必要です。これを行うために、選択したセルを変更し続ける必要がない場合は、この方法をお勧めします。
助言がありますか?
ありがとう
アイザック
ええと、これはdatagridviewなので...質問の「winforms」については申し訳ありません...しかし、私はこれを行うことができます..1行上または下にスクロールします。
スクロールアップする:
this.FirstDisplayedScrollingRowIndex = this.FirstDisplayedScrollingRowIndex - 1
下へスクロール:
this.FirstDisplayedScrollingRowIndex = this.FirstDisplayedScrollingRowIndex + 1;
ただし、数値が範囲を超えていないことを確認する必要があります。
これを行うには、HorizontalScrollingOffset
のVerticalScrollingOffset
/DataGridView
を設定します
horizontalScrollingOffsetを設定するには
dataGridView1.HorizontalScrollingOffset = dataGridView1.HorizontalScrollingOffset + 10;
小切手
DataGridView.HorizontalScrollingOffsetプロパティ
そして
VerticalScrollingOffset
の場合、Reflectionを使用できます
名前空間を含めるSystem.Reflection
PropertyInfo verticalOffset = dataGridView1.GetType().GetProperty("VerticalOffset", BindingFlags.NonPublic | BindingFlags.Instance);
verticalOffset.SetValue(this.dataGridView1, 10, null);
WinAPIを使用して、上または下にスクロールするように指示するメッセージをコントロールに送信することで、これを行うことができます。
これがコードです、私はそれが役立つことを願っています:
private const int WM_SCROLL = 276; // Horizontal scroll
private const int WM_VSCROLL = 277; // Vertical scroll
private const int SB_LINEUP = 0; // Scrolls one line up
private const int SB_LINELEFT = 0;// Scrolls one cell left
private const int SB_LINEDOWN = 1; // Scrolls one line down
private const int SB_LINERIGHT = 1;// Scrolls one cell right
private const int SB_PAGEUP = 2; // Scrolls one page up
private const int SB_PAGELEFT = 2;// Scrolls one page left
private const int SB_PAGEDOWN = 3; // Scrolls one page down
private const int SB_PAGERIGTH = 3; // Scrolls one page right
private const int SB_PAGETOP = 6; // Scrolls to the upper left
private const int SB_LEFT = 6; // Scrolls to the left
private const int SB_PAGEBOTTOM = 7; // Scrolls to the upper right
private const int SB_RIGHT = 7; // Scrolls to the right
private const int SB_ENDSCROLL = 8; // Ends scroll
[DllImport("user32.dll",CharSet=CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg,IntPtr wParam, IntPtr lParam);
ここで、フォームにテキストボックスコントロールがあると仮定します。あなたはそれを動かすことができます:
SendMessage(textBox1.Handle,WM_VSCROLL,(IntPtr)SB_PAGEUP,IntPtr.Zero); //ScrollUp
SendMessage(textBox1.Handle,WM_VSCROLL,(IntPtr)SB_PAGEDOWN,IntPtr.Zero); //ScrollDown
その古典的な一般的な解決策があなたのために機能しない場合。 FirstDisplayedScrollingRowIndex プロパティを確認し、ドラッグ中のマウスの位置に関して変更することをお勧めします。
dgv.FirstDisplayedScrollingRowIndex = dgv.RowCount - 1;
DragOverイベントを実装する必要があります。マウスがコントロールの上部または下部の近くにあるかどうかを確認します(PointToClientを使用)。そうである場合は、約200ミリ秒の間隔でタイマーを有効にします。 Tickイベントハンドラーで、DGVを1行スクロールします。マウスが閉じていないとき、およびDoDragDropが戻った後は、タイマーを無効にします。ユーザーは、端の近くでホバリングするだけで、グリッドを簡単かつ直感的にスクロールできるようになりました。