Грид не сортирует записи.

Почему DataGrid (а может DataGridView?) может не сортировать записи при нажатии мышкой на заголовок столбца? Стрелка на заголовке направление меняет, но сортировки не происходит...

Нравится

25 комментариев

У окна, на котором живет этот не сортирующий грид, атрибут "HideButtonsFrame" установлен в "true", это может как-то повлиять? Как, в таком случае, лечить?

кстати, в SDK указано свойство грида CanChangeSort, якобы отвечающее за возможность сортировки данных реестра, но у меня оно не прокатывает, пишет, что объект не поддерживает данное свойство...

Невозможность сортировки может быть, если колонка
1. Вычисляемая
2. С текстом SQL
3. Константная
В других случаях грид изменение порядка сортировки должен отрабатывать.

ни одно из перечисленных условий не выполняется... но грид не сортируется...

Посмотрите профайлером идут ли запросы.
Посмотрите не перекрыты ли события BeforeOpen.

запросы идут, но какие-то странные и без ORDER BY...
сначала вот такой:

SET FMTONLY ON SELECT
	[tbl_PhoneInWorking].[ID] AS [ID],
	[tbl_PhoneInWorking].[PhoneID] AS [PhoneID],
	[tbl_PhoneInWorking].[StatusID] AS [StatusID],
	[tbl_PhoneInWorking].[WorkingID] AS [WorkingID],
	[tbl_TechNumbers].[Number] AS [Number],
	[tbl_TechNumbers].[Status] AS [Status],
	[tbl_TNStatus].[Name] AS [StatusName],
	[tbl_Working].[Title] AS [Title],
	[tbl_Working].[AccountID] AS [AccountID],
	[tbl_Account].[Name] AS [AccountName],
	[tbl_Working].[OwnerID] AS [OwnerID],
	[tbl_Contact].[Name] AS [ContactName]
FROM
	[tbl_PhoneInWorking] AS [tbl_PhoneInWorking]
inner join --LEFT OUTER JOIN
	[tbl_TechNumbers] AS [tbl_TechNumbers] ON [tbl_TechNumbers].[ID] = [tbl_PhoneInWorking].[PhoneID] AND
	([tbl_TechNumbers].[Status] = ' ' OR
	[tbl_TechNumbers].[Status] = ' ')
LEFT OUTER JOIN
	[tbl_TNStatus] AS [tbl_TNStatus] ON [tbl_TNStatus].[ID] = [tbl_TechNumbers].[Status]
LEFT OUTER JOIN
	[tbl_Working] AS [tbl_Working] ON [tbl_Working].[ID] = [tbl_PhoneInWorking].[WorkingID]
LEFT OUTER JOIN
	[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_Working].[AccountID]
LEFT OUTER JOIN
	[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_Working].[OwnerID]
WHERE
	([tbl_Working].[OwnerID] = ' ' AND
	([tbl_PhoneInWorking].[StatusID] = ' ' OR
	[tbl_PhoneInWorking].[StatusID] = ' '))
 SET FMTONLY OFF

с какими-то пустыми параметрами, потом вот такой:

exec sp_executesql N'SELECT
	[tbl_PhoneInWorking].[ID] AS [ID],
	[tbl_PhoneInWorking].[PhoneID] AS [PhoneID],
	[tbl_PhoneInWorking].[StatusID] AS [StatusID],
	[tbl_PhoneInWorking].[WorkingID] AS [WorkingID],
	[tbl_TechNumbers].[Number] AS [Number],
	[tbl_TechNumbers].[Status] AS [Status],
	[tbl_TNStatus].[Name] AS [StatusName],
	[tbl_Working].[Title] AS [Title],
	[tbl_Working].[AccountID] AS [AccountID],
	[tbl_Account].[Name] AS [AccountName],
	[tbl_Working].[OwnerID] AS [OwnerID],
	[tbl_Contact].[Name] AS [ContactName]
FROM
	[tbl_PhoneInWorking] AS [tbl_PhoneInWorking]
inner join --LEFT OUTER JOIN
	[tbl_TechNumbers] AS [tbl_TechNumbers] ON [tbl_TechNumbers].[ID] = [tbl_PhoneInWorking].[PhoneID] AND
	([tbl_TechNumbers].[Status] = @P1 OR
	[tbl_TechNumbers].[Status] = @P2)
LEFT OUTER JOIN
	[tbl_TNStatus] AS [tbl_TNStatus] ON [tbl_TNStatus].[ID] = [tbl_TechNumbers].[Status]
LEFT OUTER JOIN
	[tbl_Working] AS [tbl_Working] ON [tbl_Working].[ID] = [tbl_PhoneInWorking].[WorkingID]
LEFT OUTER JOIN
	[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_Working].[AccountID]
LEFT OUTER JOIN
	[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_Working].[OwnerID]
WHERE
	([tbl_Working].[OwnerID] = @P3 AND
	([tbl_PhoneInWorking].[StatusID] = @P4 OR
	[tbl_PhoneInWorking].[StatusID] = @P5))
', N'@P1 varchar(38),@P2 varchar(38),@P3 varchar(38),@P4 varchar(38),@P5 varchar(38)', '{878A4783-39F9-41A5-B83E-00375A76E4C0}', '{878A4783-39F9-41A5-B83E-00575A76E4C0}', 
'{A653FD19-379F-484B-8519-A1AD4CF4D6BF}', '{878A4783-39F9-41A5-B83E-00375A76E4C0}', '{878A4783-39F9-41A5-B83E-00575A76E4C0}'

со значениями для параметров, но опять же без ORDER BY...

"SSV" написал:SET FMTONLY ON SELECT

эта конструкция проверят формат возвращаемых данных, без фактического выполнения запроса, насколько я знаю... как бы тестирует запрос.
Хотя, признаться, не видел я, что бы Террасотф такие запросы засылал)
Может у вас там что-то кем-то доделано/переделано ?

А вот второй уже сам запрос.
А по какому полю вы сортируете? оно есть в полях выборки?

да, и события BeforeOpen не перекрыты.

сортирую по:

[tbl_TechNumbers].[Number] AS [Number]
[tbl_TechNumbers].[Status] AS [Status]
[tbl_TNStatus].[Name] AS [StatusName]
[tbl_Working].[Title] AS [Title]
[tbl_Account].[Name] AS [AccountName]
[tbl_Contact].[Name] AS [ContactName]

конечно же они есть в выборке, я же на заголовки их столбцов нажимаю, чтобы отсортировать...

"SSV" написал:да, и события BeforeOpen не перекрыты.

и на dlData в реестре и на самом сервисе датасета?

аа тоесть не работает сортировка вообще ни почему .. хм...

я так понимаю вы используете ADODataset?

еще вспомнил - это несортирующийся DataGridView показывает данные не из того-же датасета, что и другие, т.е. в обработчике OnActiveViewChanged я изменяю свойство grdData.DatasetLink, присваиваю ему другой даталинк... ну и соответственно возвращаю обратно в нужный момент... но на других DataGridView-ах это никак не сказывается - они сортируют без проблем...

"Доленко Юрий" написал:и на dlData в реестре и на самом сервисе датасета?

именно так...
"Доленко Юрий" написал:я так понимаю вы используете ADODataset?

в данном случае нет...

"SSV" написал:в данном случае нет...

а как вы так лихо тогда составное условие в inner join вставили? )

"Доленко Юрий" написал:а как вы так лихо тогда составное условие в inner join вставили? )

аааа... не туда посмотрел... так что, не будет сортировать?

"SSV" написал:так что, не будет сортировать?

Должно по идеи. Когда-то делал и вроде все было ок.
У меня нет возможности проверить... Попробуйте упростить задачу гриду. Скормите ему какой-нибудь запрос попроще с одним-двумя полями с ADODataset без динамической привязки, что б ссылка на датасет была статичечксой.

А, так в случае с ADODataset сортировки не будет, потому что у него, в отличии от обычного, нет запроса на выборку, в который можно подставлять сортировку. ADODataset ссылается сразу на ADOConnection и не реагирует на запросы пересортироваться от своих колонок. Ему просто нечем изменять порядок.

"Стоян Виталий" написал:А, так в случае с ADODataset сортировки не будет

О как. Будем знать.
А ему можно на лету менять текст запроса?

В ADODataset есть свойство UpdateCommand, которое содержит ADOCommand, в котором можно добраться до свойства SQLText. После этого можно попробовать переоткрыть датасет. Сам не пробовал, но думаю, что выполнится новый запрос.

Даже если подставить новый запрос, то когда его выполнять? События, реагирующего на клик по заголовку, у DataGrid нет...
А в OnClick DataGrid-а можно добраться до координат положения указателя мышки?

У контейнера грида grdData есть свойства SelectedColumn и SelectedIDs. Из первой можно вытянуть название колонки, из другой - ID.

"Стоян Виталий" написал:У контейнера грида grdData есть свойства SelectedColumn и SelectedIDs. Из первой можно вытянуть название колонки, из другой - ID.

но грид не реагирует на жмаканье в заголовок, он реагирует только если прям на таблице кликнуть и при этом если кликнуть по пустой записи, то в SelectedColumn название колонки не изменится...

и еще - это датасет не позволяет фильтровать записи по значению поля, т.е. внизу грида не появляется название выбранного поля, это тоже особенность ADO-шных сервисов?

Позвольте с Вами не согласиться. Определил обработчик OnClick грида, в лог выводил grdData.SelectedColumn.Name. Даже при кликах на пустых ячейках название колонки в лог добавляется. Аналогично и с grdData.SelectedIDs.
По поводу названия поля внизу грида - это способ вызова быстрого фильтра. Так как ADO датасет не умеет сортироваться, то и возможность вызова быстрого фильтра для него отключена. По той же причине он не генерирует события при клике на заголовок.

Показать все комментарии