Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема c CListCtrl

15K
15 марта 2006 года
hadush
7 / / 14.03.2006
Люди подскажите пожалуйста, почему я когда пересоздаю список данных в CListCtrl, на экране не происходит ни каких изменений в диалоговом окне(т.е. список содержит старые данные, а не обновленные). Как же мне произвести обнавление в списке на экране?
CListCtrl m_listKlient – сам список
CRecordSet *m_pKlientSet – выборка данных происходит из этого источника.
Вот участок кода.
Код:
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);
}
15K
15 марта 2006 года
hadush
7 / / 14.03.2006
Уточнение.

Вот процедура которая вызывает предыдущею процедуру 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();
}
15K
16 марта 2006 года
hadush
7 / / 14.03.2006
Светлые головы, ну, подскажите, как же мне перерисовать список(CListCtrl). Который день уже бьюсь, ничего не выходит:{.
2.4K
17 марта 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by hadush
Светлые головы, ну, подскажите, как же мне перерисовать список(CListCtrl). Который день уже бьюсь, ничего не выходит:{.



UpdateWindow() а не UpdateData();

395
17 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by dinasok51
UpdateWindow() а не UpdateData();


По идее все само должно перерисовываться, не надо вызывать ни UpdateData, ни UpdateWindow... Ни SetRedraw...

15K
17 марта 2006 года
hadush
7 / / 14.03.2006
Цитата:
Originally posted by RelB
По идее все само должно перерисовываться, не надо вызывать ни 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();

сообщение мне показало имена всех строчек вместе с добавленной!, и что самое обидное, новая строчка тут же появилась на экране в списке. Так что я даже не знаю что делать может быть можно как то, что то, выводить и быстро скрывать, чтоб все обновлялось, раз по-другому не получается :-(.
2.4K
17 марта 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by hadush
Вот вот и я про тоже.

Я уже тут стал грешить на объект 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();

сообщение мне показало имена всех строчек вместе с добавленной!, и что самое обидное, новая строчка тут же появилась на экране в списке. Так что я даже не знаю что делать может быть можно как то, что то, выводить и быстро скрывать, чтоб все обновлялось, раз по-другому не получается :-(.


Про UpdateWindow() я прочел года 3 назад.
У меня тоже не всегда CListCtrl обновлялся, пока я UpdateWindow всюду не понатыкал.

15K
21 марта 2006 года
hadush
7 / / 14.03.2006
Все получилось:D
никаких UpdateWindow и т.д. не надо, все и так обнавляется(собственно как и предпологалось) :-)

Ответ.
Отказался от наследования класса CRecordset и просто создавал обьект прям в теле метода, и все заработало.

Было потрачено целых 6 дней на решение проблеммы :-(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог