![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
dxdbgrid - выделенный столбец [D3, D4, D5, D6]
battar © (2002-09-20 22:45:00)как определить какой выделен столбец в данный момент.
На старом добром дбгриде это было так:
mytext:=DBGird1.SelectedField.AsString.
ЗЫЖ Доку на английском не могу читать.
vuk (2002-10-04 18:03:00) [1]>хех... к примеру в таблице у меня это поле SUMM, то как найти
>его индекс?
Вы столбец, который это поле отображает знаете? Если нет, то у грида есть метод FindColumnByFieldName.
battar (2002-10-04 17:38:00) [2]
> n := GridColumn.Index; //индекс колонки для получения данных
хех... к примеру в таблице у меня это поле SUMM, то как найти его индекс?
или я что-то не умею читать :)
vuk (2002-10-03 22:34:00) [3]to battar:
>используется номер, но если пользователь перенесет столбец,
>то суммируется по другому...
В моем коде так не будет, я Вас уверяю. Я только что проверил это еще раз и все работает правильно.
Чтобы разобраться что к чему нужно знать как QuantumGrid хранит информацию. Там все данные содержатся в нодах(TdxTreeListNode), причем на каждую строчку (в том числе и заголовки групп) в гриде имеется одна нода. Данные колонок хранятся внутри ноды и доступны через свойство-массив Values. Индексом в этом массиве является индекс колонки. Причем, этот индекс при перемещении колонки будет меняться, поэтому передвычислениями нужно взять правильный индекс. Что у меня и сделано.
>но все-таки мож есть стандартное решение...
Стандартное решение я уже Вам написал.
battar (2002-10-03 21:33:00) [4]кстати насчет синхронизации, у меня почему то какой-странный глюк - по Ф2 на ячейки - пока не нажал одно значение показывал, как нажал - другое.
edgoSyncSelection включено...
Это глюк или опция?
battar (2002-10-03 21:29:00) [5]о решил как:
for i:=0 to dxgrdDoc.ColumnCount-1 do
if upperCase(dxgrid1.Columns[i].FieldName)="SUMM" then nCol:=i;
но все-таки мож есть стандартное решение...
battar (2002-10-03 21:11:00) [6]спасибо за помощь, теперь разбираюсь в индексах колонки.
В DataSet я обращался как
DM.T_DOC.FindField("SUM").AsFloat
и суммировал по нему, в вашем же ответе ( vuk ©)
используется номер, но если пользователь перенесет столбец,
то суммируется по другому...
:(
vuk (2002-10-02 10:47:00) [7]Во-первых, SelectedNodes будет что-то содержать только в режиме LoadAllRecords, в обычном же режиме используется свойство SelectedRows, содержащее набор закладок для DataSet(bookmark).
Во-вторых, если все-таки используется режим LoadAllRecords, то синхронизировать положение в гриде с позицией в DataSet вовсе не обязательно. Дело в том, что все данные уже гридом подгружены и можно работать с ними не обращаясь к набору данных и не дергая его лишний раз. Достаточно просто выбирать нужные данные из ноды. При этом нужно помнить, что может быть включен режим группировки и нужно пропускать ноды групп.
var
i, n : integer;
Node : TdxTreeListNode;
s : string;
value : integer;
begin
n := GridColumn.Index; //индекс колонки для получения данных
value := 0;
for i := 0 to grid.SelectedCount - 1 do
begin
Node := grid.SelectedNodes[i];
if not Node.HasChildren then //пропускаем группирующие ноды
Value := Value + Node.Values[n]; //возможно придется привести variant к нужному типу данных
end;
Awex (2002-10-02 10:02:00) [8]2battar
1. Дело в синхронизация текущей записи в наборе данных и в отображаемой гриде в режиме LoadAllRecord контролируются самой гридой. И нет гарантии что запись в фокусе гриде не сответствует
текущей записи в наборе данных. Для принудительной синхронизации
существует оптиция OptionsDB -> флаг edgoSyncSelection.
2. Для прохода по всем выделенным записям можно использовать следующую конструкцию:
with dxDBGrid1
for i := 0 to SelectedCount - 1 do
begin
if SelectedNodes[i] <> nil then
begin
SelectedNodes[i].Focused := True;
<-Получаем данные из набора данных ->
end;
end
vuk (2002-10-01 21:22:00) [9]см. SelectedCount, SelectedNodes
battar (2002-10-01 20:31:00) [10]савсем никак?
battar (2002-09-25 21:13:00) [11]Большое Спасибо...
А теперь проблема - как подсчитать сумму по выделенным документам?
Я понимаю что можно как то извратиться и махом подсчитать, но у меня что-то не получается, а вот как я в гриде считаю:
procedure TfrmCheif.mnCountClick(Sender: TObject);
var
i,all:Integer;
summ:Real;
bm:TBookMark;
begin
WITH (DM.T_DOC) DO
BEGIN
all:=0;
Summ:=0;
DisableControls;
bm:=GetBookMark;
try
for i:=0 to DBGrid1.SelectedRows.Count-1 do
Begin
BookMark := DBGrid1.SelectedRows[i];
Inc(all);
Summ:=Summ+DM.T_DOC.FindField("SUM").AsFloat;
End;
finally
GotoBookMark(bm);
FreeBookMark(bm);
EnableControls;
end;
ShowEvent("Документов выделенных..."+#13+#13+
"Всего - "+IntToStr(all)+#13+
"На сумму - "+Format("%m",[Summ])+#13+#13+
MoneyToString(Summ,true,false),
1);
END;
end;
Интересует анолог выделенной функции...
Black Cat (2002-09-24 15:34:00) [12]dxDBGrid1.FocusedField.AsString
battar (2002-09-24 15:25:00) [13]Quantum Grid
че ни как?