dxDBgrid多选,遍历每条选中记录,将字段Name内容改为Str的内容
if InputQuery('刊物名称输入','请输入新的刊物名称:',Str) then
with dxDBGrid1.DataSource.DataSet do
begin
for I:=0 to dxDBGrid1.SelectedCount-1 do
begin
GoTobookmark(pointer(dxDBGrid1.SelectedRows[i]));
// Edit;
// FieldByName('Name').AsString := Str;
// Post;
end;
end;
到第二个循环的GoTobookmark(pointer(dxDBGrid1.SelectedRows[i]));就'List Index out of bounds(1)'。
以前得我都看了,好像没有改记录内容的。
for I:=0 to dxDBGrid1.SelectedCount-1 do
->for i := dxDBGrid1.SelectedCount - 1 downto 0 do
----------
用过 dxDBGrid 的大侠看过来,拖动字段分组后,怎样将指定的组中的全部行选中 ( 积分:100, 回复:3, 阅读:42 )
分类:控件 - 使用 ( 版主:amo, cAkk )
来自:mytsin, 时间:2001-6-7 14:09:00, ID:557591 [显示:小字体 | 大字体]
比如:a,90;a,91;a92;b,80;b85 分组后成了
a
90
91
92
b
80
85
我想将 b 组的数据选中。
来自:wind_cloudy, 时间:2001-6-7 14:42:00, ID:557645
设置dxDbgrid的OptionsBehavior属性的edgoMultiSelect为true
设置dxDbgrid的OptionsView属性的edgoRowSelect为true
按住ctrl或shift键,用鼠标选择.
------------------------------------------------------------------------------
如何在DXDBGRID(DEV EXPRESS中的一个控件)中在列标题上出现排序的小箭头?
来自:Slong, 时间:2001-2-8 10:28:00, ID:451611
The ExpressQuantumGrid performs sorting automatically if the egoLoadAllRecords
and egoAutoSort options (options property) are active. If you wish to
incorporate multiple column sorting (available with egoLoadAllRecords set to
True), all you must do is to activate the egoMultiSort option (the OptionEx
property).
You have to write your own code within the OnColumnClick event to sort the
ExpressQuantumGrid if it is not in LoadAllRecords mode. For additional
information, see the ExpressQuantumGrid Objects and Components reference.
以上是DXDBGRID的帮助中有关排序的说明,也就是有两中方法去实现你的目的:
1. 设置OptionsBehavior.egoLoadAllRecords 和 OptionsDB.egoAutoSort属性为True
就可以,不过我试了一下,要指定KeyField属性的值才有效。
2. 在OnColumnClick事件中加入你的排序方法,以下是它的Demo中的代码:
with TdxDBGrid(Sender) do
begin
OldSorted := Column.Sorted;
if (GetAsyncKeyState(VK_SHIFT) = 0) then
TdxDBGrid(Sender).ClearColumnsSorted;
if OldSorted = csUp then
Column.Sorted := csDown
else
Column.Sorted := csUp;
with TQuery(DataSource.DataSet) do
begin
ID := FieldByName('ID').AsInteger;
DisableControls;
try
Close;
SQLOrderSt := '';
for i := 0 to SortedColumnCount - 1 do
begin
if SQLOrderSt <> '' then
SQLOrderSt := SQLOrderSt + ', ';
SQLOrderSt := SQLOrderSt + GetFieldName(SortedColumns[i]);
if SortedColumns[i].Sorted = csDown then
SQLOrderSt := SQLOrderSt + ' DESC';
end;
if SQLOrderSt <> '' then
SQLOrderSt := 'ORDER BY ' + SQLOrderSt;
SQL.Strings[SQL.Count - 1] := SQLOrderSt;
Open;
Locate('ID', ID, []);
finally
EnableControls;
end;
end;
end;
由此我们可看到它是用动态SQL语句重新ORDER BY记录了。
------------------------------------------------------------------------------
各位大侠帮帮忙!急需的,我用CreateColumn方法不行,怎么办?
来自:hpretty, 时间:2002-5-31 10:00:00, ID:1134606
这是我的源码,你自己看着改一下就可以的!
procedure CreatedxGridColumn(dxGrid: TdxDBGrid);
var
I,J,K: integer;
C: TdxDBTreeListColumnClass;
lFieldInfo:TFieldDictInfo;
daqLookup:TQuery;
D:TdxDBGridPickColumn;
sLookField,sSQL:String;
lSQLParser:TSQLAnalysis;
function GetListColumnsClass(AField: TField;DataSet:TDataSet): TdxDBTreeListColumnClass;
var
lFieldInfo:TFieldDictInfo;
lSQLParser:TSQLAnalysis;
begin
lSQLParser:=TSQLAnalysis.Create;
lSQLParser.SQLString:=(DataSet as TQuery).SQL.Text;
try
if AField.FieldKind = fkLookup then
Result := TdxDBGridLookupColumn
else begin
if AField.FieldKind = fkData then begin
case AField.DataType of
ftBoolean : Result := TdxDBGridCheckColumn;
ftDate, ftDateTime : Result := TdxDBGridDateColumn;
ftTime : Result := TdxDBGridTimeColumn;
ftCurrency : Result := TdxDBGridCurrencyColumn;
ftGraphic : Result := TdxDBGridImageColumn;
ftBytes, ftVarBytes, ftBlob, ftMemo,
ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary :
Result := TdxDBGridBlobColumn;
else
lFieldInfo := DBDictInfo.FindFieldDictInfo(AField.FieldName,lSQLParser.Froms);
if (lFieldInfo.LookupTable <> '') and (not AField.ReadOnly) then Result := TdxDBGridPickColumn
else Result := TdxDBGridColumn;
end;
end else
Result := TdxDBGridMaskColumn;
end;
finally
lSQLParser.Free;
end;
end;
begin
if dxGrid.DataSource = nil then Exit;
if dxGrid.DataSource.DataSet.FieldCount < 1 then exit;
if dxGrid.KeyField = '' then
dxGrid.KeyField := dxGrid.DataSource.DataSet.Fields[0].FieldName;
for I := 0 to dxGrid.DataSource.DataSet.FieldCount - 1 do
begin
if not dxGrid.DataSource.DataSet.Fields[I].Visible then Continue;
//显示MEMO字段,Modified by Xufeng
// if (GetListColumnsClass(dxGrid.DataSource.DataSet.Fields[I],dxGrid.DataSource.DataSet) = TdxDBGridBlobColumn) then Continue;
C := TdxDBTreeListColumnClass(GetListColumnsClass(dxGrid.DataSource.DataSet.Fields[I],dxGrid.DataSource.DataSet));
if C <> nil then
begin
with dxGrid.CreateColumn(C) do
begin
FieldName := dxGrid.DataSource.DataSet.Fields[I].FieldName;
//判断是否从另一个表里取数据
if C = TdxDBGridPickColumn then
begin
D := TdxDBGridPickColumn(dxGrid.ColumnByFieldName(dxGrid.DataSource.DataSet.Fields[I].FieldName));
lSQLParser:=TSQLAnalysis.Create;
lSQLParser.SQLString:=(dxGrid.DataSource.DataSet as TQuery).SQL.Text;
try
lFieldInfo := DBDictInfo.FindFieldDictInfo(dxGrid.DataSource.DataSet.Fields[i].FieldName,lSQLParser.Froms);
if lFieldInfo.LookupTable <> '' then
begin
daqLookup := TQuery.Create(nil);
try
K := Pos(';',lFieldInfo.LookupFieldsString);
if K=0 then sLookField := lFieldInfo.LookupFieldsString
else sLookField := Copy(lFieldInfo.LookupFieldsString,1,K-1);
sSQL := 'Select ' + sLookField + ' from ' + lFieldInfo.LookupTable;
if lFieldInfo.RangeField <> '' then sSQL := sSQL + ' where ' + lFieldInfo.RangeField + '=''' + lFieldInfo.RangeValue + '''';
daqLookup.SQL.Add(sSQL);
daqLookup.DatabaseName := GlobalInfos.DataBaseName;
daqLookup.Open;
for J := 1 to daqLookup.RecordCount do begin
D.Items.Add(daqLookup.FieldByName(sLookField).AsString);
daqLookup.Next;
end;
finally
daqLookup.Free;
end;
end;
finally
lSQLParser.Free;
end;
end;
end;
end;
end;
end;