Как связать RecordSet c TreeView ?
От: Kost  
Дата: 21.11.01 11:13
Оценка:
Используется VC++6.0 для доступа к MS SQL Server через ODBC. Формируется Recordset, на основе которого строится TreeView (Windows Controls). При работе пользователей с TreeView необходимо обращаться к RecordSet и считывать из него всякую инфу. Как связать RecordSet с TreeView, чтобы например после сортировки или другого перестроения TreeView по определенным параметрам, легко находить соответствующую запись в RecordSet? Сейчас чтобы найти соответствующую запись в RecordSet приходиться отсчитывать определенное количество записей с начала RecordSeta, которое соответствует порядковому номеру Noda в дереве. Соответственно если порядок Nodoв в дереве меняется, то данный метод не работает. В RecordSet не вставишь номера Nodoв (так как он связан с источником данных и изменяться не может) и в TreeView нет места куда бы поместить номер записи RecordSeta. Подскажите кто как делает. Может есть классические варианты?
Re: Как связать RecordSet c TreeView ?
От: Willi  
Дата: 21.11.01 12:31
Оценка:
Здравствуйте Kost, Вы писали:

K>Используется VC++6.0 для доступа к MS SQL Server через ODBC. Формируется Recordset, на основе которого строится TreeView (Windows Controls). При работе пользователей с TreeView необходимо обращаться к RecordSet и считывать из него всякую инфу. Как связать RecordSet с TreeView, чтобы например после сортировки или другого перестроения TreeView по определенным параметрам, легко находить соответствующую запись в RecordSet? Сейчас чтобы найти соответствующую запись в RecordSet приходиться отсчитывать определенное количество записей с начала RecordSeta, которое соответствует порядковому номеру Noda в дереве. Соответственно если порядок Nodoв в дереве меняется, то данный метод не работает. В RecordSet не вставишь номера Nodoв (так как он связан с источником данных и изменяться не может) и в TreeView нет места куда бы поместить номер записи RecordSeta. Подскажите кто как делает. Может есть классические варианты?


Что значит нет места? A lParam?

Обычно при выборке данных у каждой записи есть полк — уникальный ключ (например поле типа int c опцией Identity, или типа Serial), если его нет, то можно попробовать его сэмулировать.
После вставки элемента в дерево, запихиваем этот ключ в lParam

что-то вроде

FiledsPtr fields = rs->Fields;
...
HTREEITEM hItem = treeCtrl.InsertItem(fields->Item["name"]->Value, hParent);
treeCtrl.SetItemData(hItem, (DWORD)(long)fields->Item["id"]->Value);
\/\/i||i
Re: Как связать RecordSet c TreeView ?
От: Dale  
Дата: 22.11.01 10:09
Оценка:
Здравствуйте Kost, Вы писали:

K>... В RecordSet не вставишь номера Nodoв (так как он связан с источником данных и изменяться не может) и в TreeView нет места куда бы поместить номер записи RecordSeta. Подскажите кто как делает. Может есть классические варианты?


На самом деле место там есть, как и в большинстве подобных control'ов. TreView имеет свойство Tag, которое для этого и задумывалось. Чтобы не быть голословным, выдержка из MSDN:

Tag Property

Returns or sets an expression that stores any extra data needed for your program. Unlike other properties, the value of the Tag property isn't used by Visual Basic; you can use this property to identify objects.

Syntax


object.Tag [= expression]


Сам использовал для аналогичных целей, работает. Вот только мне показалось несколько рискованным хранить в этом поле номер записи. Жизнь научила, что СУБД обращаются с порядком записей весьма вольно, по крайней мере, никто не обещает его соблюдать. Лично я хранил в этом поле первичный ключ, по которому всегда можно однозначно найти запись.
Успехов!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.