Шаг 38 - Набор записей и ComboBoх Продолжение

На самом деле это еще не все. При создании в Access классификаторов есть ключевое поле. Оно очень удобное это поле. Автоматически ведется счет. Не по порядку сразу скажу. Сначала все нормально, но стоит удалить запись как нумерация сбивается. Когда производиться связь таблиц по в таблицу обычно подставляется идентификатор указывающий на поле. По этому идентификатору надо отражать содержимое в ComboBox.

38_1.gif (7042 b)

Наш класс этого не умеет, надо учить. Принцип пока будет такой. Мы ему передаем идентификатор, а он номер отражает выбранной ту запись, идентификатор которой мы послали. Пишем функцию SetRecord.

void CDaoCombo::SetRecord(long lRecord)
{
	for (int i = 0; i < GetCount(); i++)		// бежим по записям
	{
		long x=GetItemData(i);		// смотрим связанные данные
		if (x==lRecord) SetCurSel(i);	// если совпадают показать
	}
}

Пока не понятно. Но вот в чем идея. В ComboBox можно хранить не только сами данные, но и связанные данные. Вот и должны при вставке элемента связать его текст с идентификатором. Процедуру вставки я переписал.

void CDaoCombo::GetRecord()
{
	m_pRecord->Open();			// открыть
	m_pRecord->MoveFirst();		// в начало
	// Пока есть записи
 
	while (! m_pRecord->IsEOF()) 
	{
		COleVariant CValue;    
		m_pRecord->GetFieldValue(csFieldName,CValue);	// получить запись
		CString s=CValue.pbVal;
		m_pRecord->GetFieldValue(csIndex,CValue);	// получить индекс	
		long d=CValue.lVal;
		long x=AddString(s);			// добавить строку
		SetItemData(x,d);				// установить индекс для нее
		x++;
		m_pRecord->MoveNext();			// на следующую
	}
	m_pRecord->Close();				// закрыть
}

Там есть еще функция сохранения поля, которая будет у нас индексом. Описана переменная.

class CDaoCombo : public CComboBox
{
	......
	DECLARE_MESSAGE_MAP()
private:
	CString csIndex;		// имя поля индекса
	CString csFieldName;	// имя поля
	CDaoRecordset * m_pRecord;	// указатель на набор записей
};

Функция для сохранения:

void CDaoCombo::SetIndex(CString csIndexName)
{
	csIndex=csIndexName;
}

При использовании все, что надо это добавить инициализацию поля индекса.

......
m_Combo.SetRecordset(m_Set);
m_Combo.SetFields("NAME");
m_Combo.SetIndex("ID");  
m_Combo.GetRecord(); 
......

И с этого момента можно устанавливать выделенным любое поле по индексу.

38_2.gif (6414 b)

В проекте находится класс CDaoCombo упaкованный для использования в Component Gallery как ogx файл.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 10.08.2001