Почему DataGrid (а может DataGridView?) может не сортировать записи при нажатии мышкой на заголовок столбца? Стрелка на заголовке направление меняет, но сортировки не происходит...
Нравится
Невозможность сортировки может быть, если колонка
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
эта конструкция проверят формат возвращаемых данных, без фактического выполнения запроса, насколько я знаю... как бы тестирует запрос.
Хотя, признаться, не видел я, что бы Террасотф такие запросы засылал)
Может у вас там что-то кем-то доделано/переделано ?
А вот второй уже сам запрос.
А по какому полю вы сортируете? оно есть в полях выборки?
сортирую по:
[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 в реестре и на самом сервисе датасета?
аа тоесть не работает сортировка вообще ни почему .. хм...
еще вспомнил - это несортирующийся DataGridView показывает данные не из того-же датасета, что и другие, т.е. в обработчике OnActiveViewChanged я изменяю свойство grdData.DatasetLink, присваиваю ему другой даталинк... ну и соответственно возвращаю обратно в нужный момент... но на других DataGridView-ах это никак не сказывается - они сортируют без проблем...
"SSV" написал:в данном случае нет...
а как вы так лихо тогда составное условие в inner join вставили? )
"SSV" написал:так что, не будет сортировать?
Должно по идеи. Когда-то делал и вроде все было ок.
У меня нет возможности проверить... Попробуйте упростить задачу гриду. Скормите ему какой-нибудь запрос попроще с одним-двумя полями с ADODataset без динамической привязки, что б ссылка на датасет была статичечксой.
А, так в случае с ADODataset сортировки не будет, потому что у него, в отличии от обычного, нет запроса на выборку, в который можно подставлять сортировку. ADODataset ссылается сразу на ADOConnection и не реагирует на запросы пересортироваться от своих колонок. Ему просто нечем изменять порядок.
"Стоян Виталий" написал:А, так в случае с ADODataset сортировки не будет
О как. Будем знать.
А ему можно на лету менять текст запроса?
В ADODataset есть свойство UpdateCommand, которое содержит ADOCommand, в котором можно добраться до свойства SQLText. После этого можно попробовать переоткрыть датасет. Сам не пробовал, но думаю, что выполнится новый запрос.
У контейнера грида grdData есть свойства SelectedColumn и SelectedIDs. Из первой можно вытянуть название колонки, из другой - ID.
"Стоян Виталий" написал:У контейнера грида grdData есть свойства SelectedColumn и SelectedIDs. Из первой можно вытянуть название колонки, из другой - ID.
но грид не реагирует на жмаканье в заголовок, он реагирует только если прям на таблице кликнуть и при этом если кликнуть по пустой записи, то в SelectedColumn название колонки не изменится...
Позвольте с Вами не согласиться. Определил обработчик OnClick грида, в лог выводил grdData.SelectedColumn.Name. Даже при кликах на пустых ячейках название колонки в лог добавляется. Аналогично и с grdData.SelectedIDs.
По поводу названия поля внизу грида - это способ вызова быстрого фильтра. Так как ADO датасет не умеет сортироваться, то и возможность вызова быстрого фильтра для него отключена. По той же причине он не генерирует события при клике на заголовок.