任何人都可以請建議我應該如何在DataGridView中實現列拖放(自動滾動)功能。我知道我可以使用controll的AllowUserToDragDrop選項。但是,由於我的datagridview控件的列數相對較多,因此我需要一個跟隨當前拖放位置的自動滾動功能,以便用戶在刪除之前可以看到目標列。我已經實現了自定義拖放功能,但仍然遇到問題以啓用自動滾動選項。DataGridView自動水平滾動列拖放
0
A
回答
1
我正在使用以下類來自動滾動TTreeView。 TScroller在它所在的框架的創建中創建,傳遞給TreeView。它在框架的毀滅中被摧毀。在TreeView的OnDragOver中,我只需調用MyDragScroller.Scroll(State);
type
TScroller = class(TObject)
private
MyTimer: TTimer;
FControl: TWinControl;
FSensitiveSize: Integer;
protected
procedure HandleTimer(Sender: TObject);
public
constructor Create(aControl: TWinControl);
destructor Destroy; override;
procedure Scroll(const aState: TDragState);
end;
implementation
{ TScroller }
constructor TScroller.Create(aControl: TWinControl);
begin
inherited Create;
MyTimer := TTimer.Create(nil);
MyTimer.Enabled := False;
MyTimer.Interval := 20; // Not too short, otherwise scrolling flashes by.
MyTimer.OnTimer := HandleTimer;
FControl := aControl;
// Width/Height from edge of FControl within which the mouse has to be for
// automatic scrolling to occur. By default it is the width of a vertical scrollbar.
FSensitiveSize := GetSystemMetrics(SM_CXVSCROLL);
end;
destructor TScroller.Destroy;
begin
FreeAndNil(MyTimer);
FControl := nil;
inherited;
end;
procedure TScroller.HandleTimer(Sender: TObject);
var
MousePos: TPoint;
MouseX: Integer;
MouseY: Integer;
function _MouseInSensitiveSize: Boolean;
begin
MousePos := FControl.ScreenToClient(Mouse.CursorPos);
MouseY := MousePos.Y;
MouseX := MousePos.X;
Result :=
((MouseY >= 0) and (MouseY < FSensitiveSize))
or ((MouseY > FControl.ClientHeight - FSensitiveSize) and (MouseY <= FControl.ClientHeight))
or ((MouseX >= 0) and (MouseX < FSensitiveSize))
or ((MouseX > FControl.ClientWidth - FSensitiveSize) and (MouseX <= FControl.ClientWidth))
;
end;
begin
if Mouse.IsDragging and _MouseInSensitiveSize then begin
if MouseY < FSensitiveSize then begin
FControl.Perform(WM_VSCROLL, SB_LINEUP, 0);
end else if MouseY > FControl.ClientHeight - FSensitiveSize then begin
FControl.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
end;
if MouseX < FSensitiveSize then begin
FControl.Perform(WM_HSCROLL, SB_LINELEFT, 0);
end else if MouseX > FControl.ClientWidth - FSensitiveSize then begin
FControl.Perform(WM_HSCROLL, SB_LINERIGHT, 0);
end;
end else begin
MyTimer.Enabled := False;
end;
end;
procedure TScroller.Scroll(const aState: TDragState);
begin
if not Mouse.IsDragging then Exit; // Only scroll while dragging.
if not (aState in [dsDragMove]) then Exit; // No use scrolling on a dsDragLeave and not nice to do so on a dsDragEnter.
MyTimer.Enabled := True;
end;
注: 如果您有需要自動滾動更多的控制,你將需要創建每個控制TScroller。在這種情況下,應用程序的性能很可能會使用某種觀察者/觀察機制在所有滾動控件之間共享計時器。
0
您可以處理OnMouseMove,並以編程方式相應地進行滾動。
相關問題
- 1. 拖動,拖放和水平滾動
- 2. 水平自動滾動datagridview c#
- 3. Datagridview中的水平滾動
- 4. 自動滾動水平ListView
- 5. 自動水平滾動
- 6. 自動水平滾動
- 7. 禁用水平拖動滾動
- 8. GWT禁用水平拖動滾動
- 9. jquery拖動水平滾動時的bug
- 10. AngularJS自動滾動拖放
- 11. C#DataGridView-如何顯示水平滾動
- 12. WinForms中的水平滾動條DataGridView
- 13. Win Forms DataGridView水平滾動條
- 14. DatagridView不顯示水平滾動條
- 15. 如何在拖放過程中自動滾動DataGridView
- 16. TinyScrollbar - 水平自動滾屏
- 17. 想要拖動我的div水平滾動顯示滾動
- 18. 水平滾動+滾動條
- 19. 滾動列表頭水平
- 20. CSS水平列表滾動?
- 21. 水平滾動列表
- 22. 列和水平滾動
- 23. 水平滾動
- 24. 水平滾動?
- 25. 水平滾動
- 26. 水平滾動
- 27. 水平滾動
- 28. 製作DataGridView水平滾動事件滾動另一個控件
- 29. JList水平自動滾動到右邊
- 30. 自動化水平滾動jQuery中
謝謝,我試過(其實我試過OnMouseMove和OnDragDrop事件)。它工作正常,但不能靈活地向前和向後滾動。你會推薦什麼水平滾動條的方法來分配當前的鼠標光標藥水? – Bedasso 2010-05-20 21:41:55
你看過FirstDisplayedScrollingRowIndex屬性嗎? – TreDubZedd 2010-05-20 22:01:33
是的,我在上面指定的事件上使用了FirstDisplayedColumnIndex。雖然自動滾動以這種方式工作,但它不像用戶應該那樣得心應手。 – Bedasso 2010-05-24 14:34:11