void CKlientDlg::InsertItemsKlient()
{
UpdateData(TRUE);
m_listKlient.SetRedraw(FALSE);
m_listKlient.DeleteAllItems();
CString str="";
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvi.state = 0;
lvi.stateMask = 0;
lvi.iImage = 0;
m_pKlientSet->m_strSort = "Name";
if(!m_pKlientSet->IsOpen())
m_pKlientSet->Open();
m_pKlientSet->Requery();
int i = 0;
while(!m_pKlientSet->IsEOF())
{
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.pszText = "";
m_listKlient.InsertItem(&lvi);
m_listKlient.SetItemText(i,0,m_pKlientSet->m_Name);
…
…
i++;
m_pKlientSet->MoveNext();
}
m_pKlientSet->Close();
m_listKlient.SetRedraw(TRUE);
UpdateData(FALSE);
}
Проблема c CListCtrl
CListCtrl m_listKlient – сам список
CRecordSet *m_pKlientSet – выборка данных происходит из этого источника.
Вот участок кода.
Код:
Вот процедура которая вызывает предыдущею процедуру InsertItemsKlient();
Собственно она и добавляет запись путем SQL запроса. Также я заметил что если постоянно пытаться добавлять запись то после 3 раза на экране выводятся сразу 3 добавленные записи. Так почему же он сразу не обновляет рабочую область списка?
Код:
void CKlientDlg::OnBnClickedAddKlient()
{
CString str;
CKlientAddEditDlg dlg;
if(dlg.DoModal()==IDOK)
{
CDatabase database;
CString sSql;
TRY
{
if(database.OpenEx("DSN=CustPV;DBQ=d:\\CustPV.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;",CDatabase::noOdbcDialog))
{
sSql.Format("INSERT INTO klient (name) VALUES ('%s')",dlg.m_name);
database.ExecuteSQL(sSql);
database.Close();
}
}
CATCH_ALL(e)
{
AfxMessageBox("Драйвер не установлен");
}
END_CATCH_ALL;
};
InsertItemsKlient();
}
{
CString str;
CKlientAddEditDlg dlg;
if(dlg.DoModal()==IDOK)
{
CDatabase database;
CString sSql;
TRY
{
if(database.OpenEx("DSN=CustPV;DBQ=d:\\CustPV.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;",CDatabase::noOdbcDialog))
{
sSql.Format("INSERT INTO klient (name) VALUES ('%s')",dlg.m_name);
database.ExecuteSQL(sSql);
database.Close();
}
}
CATCH_ALL(e)
{
AfxMessageBox("Драйвер не установлен");
}
END_CATCH_ALL;
};
InsertItemsKlient();
}
Светлые головы, ну, подскажите, как же мне перерисовать список(CListCtrl). Который день уже бьюсь, ничего не выходит:{.
Цитата:
Originally posted by hadush
Светлые головы, ну, подскажите, как же мне перерисовать список(CListCtrl). Который день уже бьюсь, ничего не выходит:{.
Светлые головы, ну, подскажите, как же мне перерисовать список(CListCtrl). Который день уже бьюсь, ничего не выходит:{.
UpdateWindow() а не UpdateData();
Цитата:
Originally posted by dinasok51
UpdateWindow() а не UpdateData();
UpdateWindow() а не UpdateData();
По идее все само должно перерисовываться, не надо вызывать ни UpdateData, ни UpdateWindow... Ни SetRedraw...
Цитата:
Originally posted by RelB
По идее все само должно перерисовываться, не надо вызывать ни UpdateData, ни UpdateWindow... Ни SetRedraw...
По идее все само должно перерисовываться, не надо вызывать ни UpdateData, ни UpdateWindow... Ни SetRedraw...
Вот вот и я про тоже.
Я уже тут стал грешить на объект m_klientSet (CRecordSet), думаю может он не успевает с базы данных подтянуть обновленные данные (хотя у меня m_nDefaultType = dynaset), и для проверки вставил строчку в первый листинг выводящую на экран сообщение с именем строки добавляемой в список.
Код:
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.pszText = "";
m_listKlient.InsertItem(&lvi);
m_listKlient.SetItemText(i,0,m_pKlientSet->m_Name);
AfxMessageBox(m_pKlientSet->m_Name);
…
i++;
m_pKlientSet->MoveNext();
lvi.iSubItem = 0;
lvi.pszText = "";
m_listKlient.InsertItem(&lvi);
m_listKlient.SetItemText(i,0,m_pKlientSet->m_Name);
AfxMessageBox(m_pKlientSet->m_Name);
…
i++;
m_pKlientSet->MoveNext();
сообщение мне показало имена всех строчек вместе с добавленной!, и что самое обидное, новая строчка тут же появилась на экране в списке. Так что я даже не знаю что делать может быть можно как то, что то, выводить и быстро скрывать, чтоб все обновлялось, раз по-другому не получается :-(.
Цитата:
Originally posted by hadush
Вот вот и я про тоже.
Я уже тут стал грешить на объект m_klientSet (CRecordSet), думаю может он не успевает с базы данных подтянуть обновленные данные (хотя у меня m_nDefaultType = dynaset), и для проверки вставил строчку в первый листинг выводящую на экран сообщение с именем строки добавляемой в список.
сообщение мне показало имена всех строчек вместе с добавленной!, и что самое обидное, новая строчка тут же появилась на экране в списке. Так что я даже не знаю что делать может быть можно как то, что то, выводить и быстро скрывать, чтоб все обновлялось, раз по-другому не получается :-(.
Вот вот и я про тоже.
Я уже тут стал грешить на объект m_klientSet (CRecordSet), думаю может он не успевает с базы данных подтянуть обновленные данные (хотя у меня m_nDefaultType = dynaset), и для проверки вставил строчку в первый листинг выводящую на экран сообщение с именем строки добавляемой в список.
Код:
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.pszText = "";
m_listKlient.InsertItem(&lvi);
m_listKlient.SetItemText(i,0,m_pKlientSet->m_Name);
AfxMessageBox(m_pKlientSet->m_Name);
…
i++;
m_pKlientSet->MoveNext();
lvi.iSubItem = 0;
lvi.pszText = "";
m_listKlient.InsertItem(&lvi);
m_listKlient.SetItemText(i,0,m_pKlientSet->m_Name);
AfxMessageBox(m_pKlientSet->m_Name);
…
i++;
m_pKlientSet->MoveNext();
сообщение мне показало имена всех строчек вместе с добавленной!, и что самое обидное, новая строчка тут же появилась на экране в списке. Так что я даже не знаю что делать может быть можно как то, что то, выводить и быстро скрывать, чтоб все обновлялось, раз по-другому не получается :-(.
Про UpdateWindow() я прочел года 3 назад.
У меня тоже не всегда CListCtrl обновлялся, пока я UpdateWindow всюду не понатыкал.
никаких UpdateWindow и т.д. не надо, все и так обнавляется(собственно как и предпологалось) :-)
Ответ.
Отказался от наследования класса CRecordset и просто создавал обьект прям в теле метода, и все заработало.
Было потрачено целых 6 дней на решение проблеммы :-(