Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 101
1

Сортировка по нажатию на поле в dbgrid

26.05.2017, 14:35. Показов 1364. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть таблица, в таблице есть название полей "Табельный номер" и "Дата", вопрос, как сделать сортировку по двум полям, чтобы и "Дату" отсортировала так же как и "Табельный номер"?
Delphi
1
2
3
4
if ADOTable1.sort=' [Табельный номер] ASC' then
ADOTable1.sort:=' [Табельный номер] DESC'
else
ADOTable1.sort:=' [Табельный номер] ASC';
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2017, 14:35
Ответы с готовыми решениями:

Сделать поле видимым в DBGrid, редактируемым программно, но не редактируемым в DBGrid
Как сделать поле видимым в DBGrid, редактируемым программно, но не редактируемым в DBGrid? Схема -...

Закрасить ячейку DBGrid по нажатию на кнопку
Здравствуйте! Как закрасить текущую ячейку DBGrid, на которой стоит курсор, (например, в красный...

Удаление записи по нажатию на строку DbGrid
Здравствуйте,нужна помощь с Delphi.Нужно сделать удаление записи по нажатию на строку в dbgrid и...

Вывод значений по нажатию из DbGrid в Label
Приветствую. Подскажите есть DbGrid в который SQL запросом выводятся данные. В DbGrid отображено 1...

5
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,375
26.05.2017, 16:38 2
А вот не выйдет сделать таким образом сортировку по двум полям. Каждый последующий клик отменит сортировку по предыдущему.
1
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 101
26.05.2017, 17:26  [ТС] 3
Пытливый, а есть какой-то другой способ сортировки по двум полям?
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,375
26.05.2017, 19:11 4
Хотя если подумать и немножко пошаманить, то можно. Вот накидал сортировку по любому сочетанию столбцов в DBGrid, но есть несколько условий. Столбцы надо предварительно создать, динамически менять названия столбцов нельзя, имя столбца не должно содержать [A] и [D] - это индикаторы порядка сортировки у меня.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
unit Unit33;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, DBClient, Provider, StdCtrls;
 
type
  TForm33 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOQuery1: TADOQuery;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
  private
    SortList: TStringList;
    SortOrder: String;
    procedure DoSomething(DataSet: TAdoQuery); virtual; abstract;
  public
    { Public declarations }
  end;
 
var
  Form33: TForm33;
 
implementation
 
{$R *.dfm}
 
procedure TForm33.DBGrid1TitleClick(Column: TColumn);
var i: Integer;
begin
 try
 if (Pos('[D]', Column.Title.Caption) = 0) and (Pos('[A]', Column.Title.Caption) = 0)
 then begin
      Column.Title.Caption := Column.Title.Caption + '[A]';
      SortList.Add(Column.FieldName + ' ASC');
      Exit;
      end;
 if Pos('[A]', Column.Title.Caption) > 0
 then begin
      Column.Title.Caption := StringReplace(Column.Title.Caption,'[A]','[D]', []);
      SortList.Delete(SortList.IndexOf(Column.FieldName + ' ASC'));
      SortList.Add(Column.FieldName + ' DESC');
      Exit;
      end;
 if Pos('[D]', Column.Title.Caption) > 0
 then begin
      Column.Title.Caption := StringReplace(Column.Title.Caption,'[D]','', []);
      SortList.Delete(SortList.IndexOf(Column.FieldName + ' DESC'));
      Exit;
      end
 finally
  SortOrder := '';
  for i := 0 to SortList.Count - 1
  do if i = 0
     then SortOrder := ' order by ' + SortList.Strings[i]
     else SortOrder := SortOrder + ',' + SortList.Strings[i];
  AdoQuery1.Close;
  AdoQuery1.SQL.Text := 'select F1.* from File1#csv as F1' + SortOrder;
  AdoQuery1.Open;
 end;
end;
 
procedure TForm33.FormCreate(Sender: TObject);
begin
 ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=H:\Work\;Extended Properties="Tex;HDR=Yes";Jet OLEDB:Engine Type=96';
 ADOQuery1.SQL.Text := 'select F1.* from File1#csv as F1';
 ADOQuery1.Open;
 SortList := TStringList.Create;
end;
 
end.
Добавлено через 1 час 34 минуты
Версия 1.1, компактнее и только с одним ограничением. Имя столбца не должно содержать [A] и [D] - это индикаторы порядка сортировки:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
unit Unit33;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, DBClient, Provider, StdCtrls;
 
type
  TForm33 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOQuery1: TADOQuery;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    SortList: TStringList;
    SortOrder: String;
  public
    { Public declarations }
  end;
 
var
  Form33: TForm33;
 
implementation
 
{$R *.dfm}
 
procedure TForm33.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var Index: Integer;
begin
 Index := SortList.IndexOfObject(Column);
 if Index = -1
 then Column.Title.Caption := Column.FieldName
 else if SortList.Strings[Index] = ' ASC'
      then Column.Title.Caption := Column.FieldName + '[A]'
      else Column.Title.Caption := Column.FieldName + '[D]';
end;
 
procedure TForm33.DBGrid1TitleClick(Column: TColumn);
var Index: Integer;
begin
 Index := SortList.IndexOfObject(Column);
 if Index = -1
 then Index := SortList.AddObject(' ASC', Column)
 else begin
      if SortList.Strings[Index] = ' ASC'
      then SortList.Strings[Index] := ' DESC'
      else SortList.Delete(Index);
      end;
 SortOrder := '';
 for Index := 0 to SortList.Count - 1
 do if Index = 0
    then SortOrder := ' order by ' + TColumn(SortList.Objects[Index]).FieldName + SortList.Strings[Index]
    else SortOrder := SortOrder + ',' + TColumn(SortList.Objects[Index]).FieldName + SortList.Strings[Index];
 Edit1.Text := SortOrder;
 AdoQuery1.DisableControls;
 AdoQuery1.Close;
 AdoQuery1.SQL.Text := 'select F1.* from File1#csv as F1' + SortOrder;
 AdoQuery1.Open;
 AdoQuery1.EnableControls;
end;
 
procedure TForm33.FormCreate(Sender: TObject);
begin
 ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=H:\Work\;Extended Properties="Tex;HDR=Yes";Jet OLEDB:Engine Type=96';
 ADOQuery1.SQL.Text := 'select F1.* from File1#csv as F1';
 ADOQuery1.Open;
 SortList := TStringList.Create;
end;
 
end.
0
Особый статус
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
26.05.2017, 20:05 5
Всегда выручала такая сортировка:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm2.DBGrid1TitleClick(Column: TColumn);
var
  What: String;
begin
 
  if ADOQuery1.FieldByName(Column.FieldName).Tag = 0 then
   begin
    What := ' DESC';
    ADOQuery1.FieldByName(Column.FieldName).Tag:= 1;
   end
 
  else
   begin
    What := ' ASC';
    ADOQuery1.FieldByName(Column.FieldName).Tag:= 0;
   end;
 ADOQuery1.Sort:= Column.FieldName + What;
end;
Любой клик отменяет предыдущую
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,375
26.05.2017, 21:44 6
Вот у меня стойкое отторжение Tag. Использую его только в совершенно безвыходной ситуации, которая случается очень редко. Ваш код почти то-же самое делает, только у меня 3 состояния нажатия на колонку отслеживается и формируется итоговая строка сортировки по всем жмякнутым колонкам.
0
26.05.2017, 21:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2017, 21:44
Помогаю со студенческими работами здесь

Dbgrid как программно по нажатию кнопки загрузить таблицу?
procedure TForm1.Button1Click(Sender: TObject); begin dbgrid1.Visible:=true;...

По нажатию на строку в DBGrid нужно записать в Label значение одного из полей (Id)
Всем привет! У меня такой вопрос есть несколько связанных таблиц , вывожу их в DBGrid и по нажатию...

Как сделать вызов формы по нажатию на ячейку DBGrid, с информацией выбранной строки?
всем привет, я делаю дипломную работу на тему (личная карточка пациента), хотелось бы узнать как...

Через DBGrid изменить данные в ячейке, и по нажатию кнопки очистить все таблицы БД
как можно самым примитивным способом через DBGrid изменить данные в ячейке. и по нажатию кнопки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru