Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как проще всего отсортировать dbgrid по щелчку на колонке?


Страницы:   1 2 3

ironwit ©   (2002-12-26 10:18:00) 

глупо но интересно :-)


kombat   (2002-12-27 18:04:00) [1]

Для DBGridEh
Возможна множественная сортировка с зажатой клавишей Ctrl
sAscFieldsList, sDescFieldsList, sAllFieldsList, sIndexName: string;


procedure TfBaseGridForm.dbgMainSortMarkingChanged(Sender: TObject);
var
i: integer;
begin
// установка маркеров сортировки на колонках грида и определение
// наименования индекса (sIndexName), наименований и порядка сортировки полей
// MultiIndex - в случае множества полей
// установка активным контролом Грида dbgMain, если не активен другой грид
Screen.Cursor := crSQLWait;
try
if (ActiveControl is TDBGridEh) then
ActiveGrid := (ActiveControl as TDBGridEh)
else
ActiveGrid := dbgMain;
sAllFieldsList := "";
sAscFieldsList := "";
sDescFieldsList := "";
sIndexName := "";
for i := 0 to (ActiveGrid as TDBGridEh).SortMarkedColumns.Count - 1 do begin
if (ActiveGrid as TDBGridEh).SortMarkedColumns[i].Title.SortMarker = smUpEh then begin
if Trim(sAscFieldsList) <> "" then
sAscFieldsList := sAscFieldsList + "; " + (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName
else
sAscFieldsList := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName;
if (ActiveGrid as TDBGridEh).SortMarkedColumns.Count = 1 then
sIndexName := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName + "_A"
else
sIndexName := "MultiIndex";
end
else begin
if Trim(sDescFieldsList) <> "" then
sDescFieldsList := sDescFieldsList + "; " + (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName
else
sDescFieldsList := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName;
if (ActiveGrid as TDBGridEh).SortMarkedColumns.Count = 1 then
sIndexName := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName + "_D"
else
sIndexName := "MultiIndex";
end;
if Trim(sAllFieldsList) <> "" then
sAllFieldsList := sAllFieldsList + "; " + (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName
else
sAllFieldsList := (ActiveGrid as
TDBGridEh).SortMarkedColumns[i].FieldName;
end;
finally
Screen.Cursor := crDefault;
end;
end;

procedure TfBaseGridForm.dbgMainTitleClick(Column: TColumnEh);
var
i: integer;
bIndexExist: boolean;
begin
// установка сортировки данных в датасете
// установка активным контролом Грида dbgMain, если не активен другой грид
Screen.Cursor := crSQLWait;
try
if (ActiveControl is TDBGridEh) then
ActiveGrid := (ActiveControl as TDBGridEh)
else
ActiveGrid := dbgMain;
dbgMainSortMarkingChanged(nil);
if Trim(sIndexName) <> "" then begin
if ((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).Active = true then begin
bIndexExist := false;
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Update;
for i := 0 to ((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Count - 1 do
if ((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Items[i].Name = sIndexName then begin
bIndexExist := true;
Break;
end
else
bIndexExist := false;
if not (bIndexExist) then begin
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).AddIndex(sIndexName, sAllFieldsList, [],
sDescFieldsList, "", 0)
end
else begin
if sIndexName = "MultiIndex" then begin
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).DeleteIndex(sIndexName);
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).AddIndex(sIndexName, sAllFieldsList, [],
sDescFieldsList, "", 0);
end;
end;
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexDefs.Update;
((ActiveGrid as TDBGridEh).DataSource.DataSet as
TClientDataSet).IndexName := sIndexName;
end;
end;
finally
Screen.Cursor := crDefault;
end;
end;


Vint   (2002-12-26 17:15:00) [2]

Roma © (26.12.02 11:42)

спасибо за совет, щас попробовал, без индексов, а все просто летает!!!
а не подскажишь, как в ClientDataSet определить способ сортировки (по возрастанию и как по убыванию)?


Jeka   (2002-12-26 16:16:00) [3]

В OnTitleClick пиши
Table1.IndexFieldNames :=Column.FieldName;
самому недавно помогли, работает


passm   (2002-12-26 14:14:00) [4]

Пользуюсь компонентами Rx - там достаточно средств для реализации сортировки как того желает автор вопроса.
RxDBGrid позволяет рисовать треугольник сортировки на заголовке столбца. RxDBGrid.DataSource.DataSet is TRxQuery в котором SQL.Text =
...
ORDER BY %ORD_COL
Далее при клике на заголовок Grida оцениваю Column.FieldName и RxQuery.MacroByName("ORD_COL").AsString...
OnTitleClick:
if Column.FieldName + " ASC" = RxQuery.MacroByName("ORD_COL").AsString then
RxQuery.MacroByName("ORD_COL").AsString:= Column.FieldName + "DESC"
else
RxQuery.MacroByName("ORD_COL").AsString:= Column.FieldName + " ASC"


Anatoly Podgoretsky   (2002-12-26 13:40:00) [5]

ironwit © (26.12.02 13:21)
И ты думаешь они напрямую работают, тогда у них суперклассные программисты.


jee   (2002-12-26 13:35:00) [6]

Использую весьма часто в своих проектах. Просто всавляешь в OnTitleClick грида. Единственно, если используешь не ADO, то просто приводи к TTаble.

procedure TXForm.DBGrid2TitleClick(Column: TColumn);
begin
TADOTable(Column.Grid.DataSource.DataSet).IndexFieldNames := Column.FieldName;
end;
Кстати бывает нужно убрать сортировку, тогда я так делаю, щелкаю на самый левый прямоугольник в гриде (который перед первой колонкой), если он конечно отображается. А обработчик вот

procedure TRepForm.DBGridMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (X < 10)and(Y < 15) then
TADOTable(DBGrid.DataSource.DataSet).IndexFieldNames := "";
end;


ironwit   (2002-12-26 13:21:00) [7]


> Roma © (26.12.02 13:07)
> > ironwit © (26.12.02 12:51)
> а стандартный работает с mуsql?
>
> Ты немного путаешь. Query не работает напрямую с БД, ни
> с какой.

в том то весь и прикол что в zeos свой query для работы с базами, там у него много поддержки и ibsql,mysql,pgsql.


Roma   (2002-12-26 13:07:00) [8]

> ironwit © (26.12.02 12:51)
а стандартный работает с mуsql?

Ты немного путаешь. Query не работает напрямую с БД, ни с какой.


ironwit   (2002-12-26 13:04:00) [9]


> Weare © (26.12.02 11:54)
>
> >to ironwit ©
>
>
> Могу и EhLib выслать, занимает где-то 1.2М. Вообще класная
> вещь, там можно очень интересные вещи вытворять

спасибо



Кулюкин Олег   (2002-12-26 12:57:00) [10]

2 sniknik © (26.12.02 10:47)
> ADODataSet1.Sort:= "LastName ASC, DateDue DESC";
Надо же!
Я и не знал о такой фиче.
Спасибо.


Кулюкин Олег   (2002-12-26 12:54:00) [11]

2 ironwit © (26.12.02 10:40)
>2. Использовать не дельфийный грид, а что-то более хитрое. ВРоде EhDBGrid умеет сортироваться.
> а где его можно было бы найти?
А яндексом поискать?
На торри посмотреть?

EhDBGrid - часть EhLib

2 Roma © (26.12.02 11:42)
ClientDataSet умеет и по убыванию сортировать.
А RxDBGrid умеет рисовать стрелочки на кепшене.
Эту связку я и использую.


ironwit   (2002-12-26 12:51:00) [12]


> Roma © (26.12.02 12:36)
> А если поменять Query от Zeos на стандартный дельфийский,
> тогда все нормально?...

а стандартный работает с mуsql?


Weare   (2002-12-26 12:48:00) [13]


> ironwit ©

Ты где-то ошибся, сделай так как Roma говорит и все нормательно.


Weare   (2002-12-26 12:46:00) [14]


> Roma ©


Вот это да, а я в свое время c SQL"ем игрался. Твоя сцепка прекрасно работает - это просто здорово.


Roma   (2002-12-26 12:36:00) [15]

А если поменять Query от Zeos на стандартный дельфийский, тогда все нормально?...


ironwit   (2002-12-26 12:33:00) [16]

все проверил еще раз, все нормально.

DataSetProvider.DataSet=query
ClientDataSet.ProviderName=DataSetProvider1
DataSource.DataSet=ClientDataSet1
Grid.DataSource=DataSource1


Roma   (2002-12-26 12:25:00) [17]

> ironwit © (26.12.02 12:05)
хотите прикол. Если пользоваться сцепкой посоветованной Roma, а query от Zeos то где теряются данные, то есть в dbgrid ничего не отображается

Если использовать нормальный стандартный TQuery - все работает... Проверь все свойства связывания - DataSetProvider.DataSet, ClientDataSet.ProviderName, DataSource.DataSet, Grid.DataSource...


ironwit   (2002-12-26 12:09:00) [18]


> vopros © (26.12.02 12:04)
> procedure TForm1.DBGridEh10TitleBtnClick(Sender: TObject;
> ACol: Integer;
> Column: TColumnEh);
> begin
> dm.Q_oborud.close;
> dm.q_oborud.SQL.delete(dm.q_oborud.sql.count-1);
> dm.q_oborud.SQL.add("order by "+column.fieldname);
> dm.Q_oborud.open;
> end;

в этом гриде может отображаться много разнах запросов, не обязательно в конце стоит order by


ironwit   (2002-12-26 12:05:00) [19]

хотите прикол. Если пользоваться сцепкой посоветованной Roma, а query от Zeos то где теряются данные, то есть в dbgrid ничего не отображается


vopros   (2002-12-26 12:04:00) [20]

procedure TForm1.DBGridEh10TitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh);
begin
dm.Q_oborud.close;
dm.q_oborud.SQL.delete(dm.q_oborud.sql.count-1);
dm.q_oborud.SQL.add("order by "+column.fieldname);
dm.Q_oborud.open;
end;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо