Help! 如何能通过对DBGRID的记录进行拖拽,改变字段值进行排序(150分)

  • 主题发起人 主题发起人 uu
  • 开始时间 开始时间
U

uu

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,我现在需要对用户选的字段进行排序(QUERY
+DBGRID), 显示的顺序是ORDER BY FORDER,如何通
过拖拽来实现调整字段FORDER的值?这个问题急死我了。
大虾们,多帮帮忙吧。
 
什么叫用拖拽来实现调整字段FORDER的值,请说得详细一点.
如果是改变排序字段,也就是说是使用TITLE BUTTON,可以使用
现有的控件,提供任何字段排序,
如果是修改记录值,自己控制拖拽,修改相应记录的值
 
我还是不明白您的意思。
是不是要选择一个字段来排序?

"通过拖拽"=什么意思?
是不是说,用户总想要这样的效果:

把"FORDER"字段拖到第一列,就按此字段排序。
这还不如点击HeaderColumn呢。

如果不是在这个环节("通过拖拽")的问题,只是数据库的问题,
具体的编程,可以参考rxlib里的例子,那个例子做的极好,
又简单又明了,就是把点击的ColumnName作为TQuery的Param:FieldName,
传回TQuery,

Select * from SomeTable,
Orderby :Fieldname

如果我的理解有错误,还望海涵。
 
是这样的,比如说有十条纪录显示,第一行纪录的FORDER为1,以此类推,第十行的FORDER为10.托拽第十条纪录到第一条纪录上,则第十条纪录FORDER改为1,原第一条
FORDER改为2,其余纪录类推.REFRESH QUERY,DBGRID按修改后的FORDER排序显示.
曹兄:不是把FORDER这个字段拖的第一列,拖拽的是纪录,FORDER不显示给用户.
Sherman:拖拽过程如何定位纪录,能说的详细点吗?
 
这么久了,没有人知道这种方法吗?有源码的控件也成啊
 
An example of drag and drop between DBGrids



This sample component and sample project demonstrates an easy way

of enabling drag and drop of an arbitrary field in one data aware

grid onto an arbitrary field in another data aware grid.



1. Launch Delphi 3 (the code will work in 1 and 2 as well with some

minor changes).



2. Do a File|New|Unit. Take the MyDBGrid unit (below) and paste it

in the newly created unit. Do a File|Save As. Save the unit as

MyDBGrid.pas.



3. Do a Component|Install Component. Switch to the Info New Package

tab. Put MyDBGrid.pas in the Unit file name box. Call the package

MyPackage.dpk. Hit Yes when Delphi 3 tells you that the package

will be built and installed. Hit OK when Delphi 3 tells you that

VCL30.DPL is needed. The package will now be rebuilt and installed.

You will now find the TMyDBGrid component on your Samples tab on

your component palette. Close the package editor and save the

package.



4. Do a File|New Application. Right click on the form (Form1) and

select View As Text. Take the GridU1 form source (below) and paste

it in Form1. Right click on the form and select View As Form. This

may take a few moments since it's opening up the tables for you.

Take the GridU1 unit (below) and paste it in the unit (Unit1).



5. Do a File|Save Project As. Save the unit as GridU1.pas. Save the

project as GridProj.dpr.



6. Now, run the project and enjoy the dragging and dropping of fields

inbetween or with the two grids.



-----------------

The MyDBGrid unit

-----------------



unit MyDBGrid;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, Grids, DBGrids;



type

TMyDBGrid = class(TDBGrid)

private

{ Private declarations }

FOnMouseDown: TMouseEvent;

protected

{ Protected declarations }

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

published

{ Published declarations }

property Row;

property OnMouseDown read FOnMouseDown write FOnMouseDown;

end;



procedure Register;



implementation



procedure TMyDBGrid.MouseDown(Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if Assigned(FOnMouseDown) then

FOnMouseDown(Self, Button, Shift, X, Y);

inherited MouseDown(Button, Shift, X, Y);

end;



procedure Register;

begin

RegisterComponents('Samples', [TMyDBGrid]);

end;



end.



---------------

The GridU1 unit

---------------



unit GridU1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, Db, DBTables, Grids, DBGrids, MyDBGrid, StdCtrls;



type

TForm1 = class(TForm)

MyDBGrid1: TMyDBGrid;

Table1: TTable;

DataSource1: TDataSource;

Table2: TTable;

DataSource2: TDataSource;

MyDBGrid2: TMyDBGrid;

procedure MyDBGrid1MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure MyDBGrid1DragOver(Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

procedure MyDBGrid1DragDrop(Sender, Source: TObject;

X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



var

SGC : TGridCoord;



procedure TForm1.MyDBGrid1MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var

DG : TMyDBGrid;

begin

DG := Sender as TMyDBGrid;

SGC := DG.MouseCoord(X,Y);

if (SGC.X > 0) and (SGC.Y > 0) then

(Sender as TMyDBGrid).BeginDrag(False);

end;

procedure TForm1.MyDBGrid1DragOver(Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

var

GC : TGridCoord;

begin

GC := (Sender as TMyDBGrid).MouseCoord(X,Y);

Accept := Source is TMyDBGrid and (GC.X > 0) and (GC.Y > 0);

end;

procedure TForm1.MyDBGrid1DragDrop(Sender, Source: TObject;

X, Y: Integer);

var

DG : TMyDBGrid;

GC : TGridCoord;

CurRow : Integer;

begin

DG := Sender as TMyDBGrid;

GC := DG.MouseCoord(X,Y);

with DG.DataSource.DataSet do begin

with (Source as TMyDBGrid).DataSource.DataSet do

Caption := 'You dragged "'+Fields[SGC.X-1].AsString+'"';

DisableControls;

CurRow := DG.Row;

MoveBy(GC.Y-CurRow);

Caption := Caption+' to "'+Fields[GC.X-1].AsString+'"';

MoveBy(CurRow-GC.Y);

EnableControls;

end;

end;

end.

---------------

The GridU1 form

---------------



object Form1: TForm1

Left = 200

Top = 108

Width = 544

Height = 437

Caption = 'Form1'

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'MS Sans Serif'

Font.Style = []

PixelsPerInch = 96

TextHeight = 13

object MyDBGrid1: TMyDBGrid

Left = 8

Top = 8

Width = 521

Height = 193

DataSource = DataSource1

Row = 1

TabOrder = 0

TitleFont.Charset = DEFAULT_CHARSET

TitleFont.Color = clWindowText

TitleFont.Height = -11

TitleFont.Name = 'MS Sans Serif'

TitleFont.Style = []

OnDragDrop = MyDBGrid1DragDrop

OnDragOver = MyDBGrid1DragOver

OnMouseDown = MyDBGrid1MouseDown

end

object MyDBGrid2: TMyDBGrid

Left = 7

Top = 208

Width = 521

Height = 193

DataSource = DataSource2

Row = 1

TabOrder = 1

TitleFont.Charset = DEFAULT_CHARSET

TitleFont.Color = clWindowText

TitleFont.Height = -11

TitleFont.Name = 'MS Sans Serif'

TitleFont.Style = []

OnDragDrop = MyDBGrid1DragDrop

OnDragOver = MyDBGrid1DragOver

OnMouseDown = MyDBGrid1MouseDown

end

object Table1: TTable

Active = True

DatabaseName = 'DBDEMOS'

TableName = 'ORDERS'

Left = 104

Top = 48

end

object DataSource1: TDataSource

DataSet = Table1

Left = 136

Top = 48

end

object Table2: TTable

Active = True

DatabaseName = 'DBDEMOS'

TableName = 'CUSTOMER'

Left = 104

Top = 240

end

object DataSource2: TDataSource

DataSet = Table2

Left = 136

Top = 240

end

end


 
infopower空间组
 
多人接受答案了。
 
后退
顶部