cxGrid_Q31584 cxgrid 拖放移动记录

cxgrid 拖放移动记录,cxgrid 拖放,cxgrid 拖动记录,cxgrid 鼠标拖动记录 这是cxgrid开发公司回复客户时所发送的源码项目,用于实现鼠标拖动记录,改变记录在表格中的位置,所以直接编译运行,供大家借鉴 

问题地址:https://www.devexpress.com/Support/Center/Question/Details/Q31584/help-with-drag-and-drop-in-cxgrid-reorder-rows

 下载地址:https://www.devexpress.com/Support/Center/Attachment/GetAttachmentFile/e1b941a6-feb1-413e-b7e1-b1c1eece12be

 

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
  cxDataStorage, cxEdit, DB, cxDBData, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, DBTables, cxGridLevel, cxClasses,
  cxControls, cxGridCustomView, cxGrid, dxSkinsCore,  StdCtrls;

type
  TForm1 = class(TForm)
    cxGrid1: TcxGrid;
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxGrid1Level1: TcxGridLevel;
    DataSource1: TDataSource;
    Table1: TTable;
    cxGrid1DBTableView1ID: TcxGridDBColumn;
    cxGrid1DBTableView1Order: TcxGridDBColumn;
    cxGrid1DBTableView1Text: TcxGridDBColumn;
    Table1ID: TAutoIncField;
    Table1Order: TSmallintField;
    Table1Text: TStringField;
    Button1: TButton;
    procedure cxGrid1DBTableView1DragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    procedure cxGrid1DBTableView1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure cxGrid1DBTableView1StartDrag(Sender: TObject;
      var DragObject: TDragObject);
    procedure Button1Click(Sender: TObject);
  private
    AKeys: Variant;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxGrid1DBTableView1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  HT: TcxCustomGridHitTest;
begin
  with TcxGridSite(Sender) do
  begin
    HT := ViewInfo.GetHitTest(X, Y);
    Accept := (HT is TcxGridRecordCellHitTest) and (TcxGridRecordCellHitTest(HT).GridRecord.RecordIndex <> GridView.DataController.FocusedRecordIndex)
  end;
end;

procedure TForm1.cxGrid1DBTableView1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  HT: TcxCustomGridHitTest;
  ASourceMinOrderValue,ASourceMaxOrderValue,ADestOrderValue: Variant;
  I: Integer;
  AController : TcxGridTableController;
  AOrderIndex : Integer;
  ADataSet : TDataset;
  AField : TField;
  IsUp : boolean;
  ADataController :  TcxDBDataController;
begin
  AOrderIndex := cxGrid1DBTableView1Order.Index;
  with TcxGridSite(Sender) do
  begin
    HT := ViewInfo.GetHitTest(X, Y);
    ADestOrderValue := TcxGridRecordCellHitTest(HT).GridRecord.Values[AOrderIndex];
    AController := TcxGridTableController(GridView.Controller);
    ADataController :=  TcxDBDataController(GridView.DataController);
    ASourceMinOrderValue := AController.SelectedRows[0].Values[AOrderIndex];
    ASourceMaxOrderValue := AController.SelectedRows[AController.SelectedRowCount-1].Values[AOrderIndex];
    ADataSet :=  ADataController.DataSet;
    AField := ADataSet.FieldByName('Order');
    IsUp := (ADestOrderValue < ASourceMinOrderValue);

    ADataSet.First;
    for I := 0 to ADataSet.RecordCount - 1 do
    begin
      ADataSet.Edit;
      if IsUp and (AField.AsInteger >= ADestOrderValue) and (AField.AsInteger < ASourceMinOrderValue) then
        AField.AsInteger := AField.AsInteger + AController.SelectedRowCount;
      if not IsUp and (AField.AsInteger <= ADestOrderValue) and (AField.AsInteger > ASourceMaxOrderValue) then
          AField.AsInteger := AField.AsInteger - AController.SelectedRowCount;  
      ADataSet.Post;
      ADataSet.Next;
    end;
 
    if Not IsUp then
      ADestOrderValue := ADestOrderValue - AController.SelectedRowCount + 1; 

    for I := 0 to AController.SelectedRowCount - 1 do
    begin
      TcxDBDataController(GridView.DataController).LocateByKey(AKeys[I]);
      ADataset.Edit;
      AField.Value := ADestOrderValue + I;
      ADataset.Post;
    end;

  end;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  Table1.Open;
end;



procedure TForm1.cxGrid1DBTableView1StartDrag(Sender: TObject;
  var DragObject: TDragObject);
var
  I: Integer;
begin
  with TcxGridDBTableView(TcxGridSite(Sender).GridView) do
  begin
    AKeys := VarArrayCreate([0, Controller.SelectedRecordCount - 1], varVariant);
    for I := 0 to Controller.SelectedRecordCount - 1 do
      AKeys[I] := Controller.SelectedRecords[I].Values[cxGrid1DBTableView1ID.Index];
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Table1 do
  begin
    DisableControls;
    try
      First;
      while not Eof do
      begin
        Edit;
        FieldValues['Order'] := FieldValues['ID']; 
        Next;
      end;
    finally
      EnableControls;
    end;
  end;
end;

end.

 

 

DFM

object Form1: TForm1
  Left = 438
  Top = 141
  Caption = 'Form1'
  ClientHeight = 430
  ClientWidth = 465
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object cxGrid1: TcxGrid
    Left = 0
    Top = 0
    Width = 465
    Height = 430
    Align = alClient
    TabOrder = 0
    object cxGrid1DBTableView1: TcxGridDBTableView
      DragMode = dmAutomatic
      OnDragDrop = cxGrid1DBTableView1DragDrop
      OnDragOver = cxGrid1DBTableView1DragOver
      OnStartDrag = cxGrid1DBTableView1StartDrag
      NavigatorButtons.ConfirmDelete = False
      DataController.DataSource = DataSource1
      DataController.KeyFieldNames = 'ID'
      DataController.Summary.DefaultGroupSummaryItems = <>
      DataController.Summary.FooterSummaryItems = <>
      DataController.Summary.SummaryGroups = <>
      OptionsSelection.CellSelect = False
      OptionsSelection.MultiSelect = True
      object cxGrid1DBTableView1ID: TcxGridDBColumn
        DataBinding.FieldName = 'ID'
        Options.Sorting = False
      end
      object cxGrid1DBTableView1Order: TcxGridDBColumn
        DataBinding.FieldName = 'Order'
        Options.Sorting = False
        SortIndex = 0
        SortOrder = soAscending
      end
      object cxGrid1DBTableView1Text: TcxGridDBColumn
        DataBinding.FieldName = 'Text'
        Options.Sorting = False
      end
    end
    object cxGrid1Level1: TcxGridLevel
      GridView = cxGrid1DBTableView1
    end
  end
  object Button1: TButton
    Left = 360
    Top = 48
    Width = 75
    Height = 25
    Caption = 'Reset Order'
    TabOrder = 1
    OnClick = Button1Click
  end
  object DataSource1: TDataSource
    DataSet = Table1
    Left = 80
    Top = 144
  end
  object Table1: TTable
    DatabaseName = '.\'
    TableName = 'TestTable.db'
    Left = 33
    Top = 144
    object Table1ID: TAutoIncField
      FieldName = 'ID'
      ReadOnly = True
    end
    object Table1Order: TSmallintField
      FieldName = 'Order'
    end
    object Table1Text: TStringField
      FieldName = 'Text'
      Size = 25
    end
  end
end

 

转载于:https://www.cnblogs.com/zhqian/p/7201637.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值