| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > MFC - Изменение текста в ListView |
| Автор: NewLine 19.5.2006, 16:23 |
| Привет. Помогите пожалуйста. Не получается изменять текст в ListView при выборе элемента. void CEx06bDialog::OnItemchangedListview1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1); int nSelected = pNMListView->iItem; if (nSelected >= 0) { pList->SetItemText(nSelected,0,"222"); } *pResult = 0; } Спасибо. |
| Автор: Earnest 19.5.2006, 16:58 | ||
| Управление туда точно приходит? Попробуй перерисовать:
|
| Автор: NewLine 19.5.2006, 17:17 |
| Управление точно приходит, т.к. выделенный текст я могу просмотреть. Но с перерисовкой тоже не получается. |
| Автор: Earnest 19.5.2006, 17:27 | ||
? В смысле дебагером? |
| Автор: NewLine 19.5.2006, 17:31 |
| Нет. CString strltem = pList->GetItemText(nSelected, 0); |
| Автор: Earnest 19.5.2006, 17:44 | ||
Так поставь точку останова и проверь. У меня следующий код точно работает. И перерисовка не нужна:
|
| Автор: NewLine 22.5.2006, 12:16 |
| Объявил я DDX_Control(pDX, IDC_LISTVIEW1, m_wndFilter); И привыболе элемента в ListView выдается ошибка. ![]() |
| Автор: Earnest 22.5.2006, 14:35 |
| Когда именно появляется Assertion? При выполнении DDX_Control (DoDataExchange)? Тогда, скорее всего, ид-р лист-контрола не такокй как ты думаешь. Зайди отладчиком по ASSERT (нажми Retry) и посмотри, что ему не нравится. Если нет, приведи код того метода, на котором падает ASSERT и покажи строку. |
| Автор: NewLine 22.5.2006, 15:47 |
| Падает Здесь ->. BOOL CListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText) { -> ASSERT(::IsWindow(m_hWnd)); ASSERT((GetStyle() & LVS_OWNERDATA)==0); LVITEM lvi; lvi.iSubItem = nSubItem; lvi.pszText = (LPTSTR) lpszText; return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi); } |
| Автор: NewLine 22.5.2006, 16:11 |
| Странно если я нажимаю просто кнопку ОК, то он всеравно ругается и выдает ту же самую ошибку Ассерт. |
| Автор: NewLine 22.5.2006, 17:23 |
| Не понимаю почему если я ставлю эти две строчки в OnInitDialog() { CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1); pList->SetItemText(3,0,"!!!"); } Все благополучно меняется. А если ставлю в обработчик события для (IDC_LISTVIEW1) сообщения LVN_ITEMCHANGED функцию void CEx06bDialog::OnItemchangedListview1(NMHDR* pNMHDR, LRESULT* pResult) { CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1); pList->SetItemText(2,0,"!!!"); //pResult = 0; } Он меня просто выкидывает. |
| Автор: Earnest 22.5.2006, 17:38 |
| Что значит "выкидывает"? Этот самый ASSERT, о котором ты раньше писал? Действительно, странно. Надо смотреть на pList, который в обработчике... Что там внутри? В смысле m_hWnd его чему равен? Может, ты его где-нибудь между делом удаляешь? Вложи весь код этого диалога. |
| Автор: NewLine 22.5.2006, 17:43 | ||||
Нет. Просто выкидывает из программы без ошибок.
|
| Автор: Earnest 22.5.2006, 18:20 |
| Вроде на первый взгляд все честно, кроме одного: ты не вызываешь базовый метод из OnInitDialog. А должен - в самом начале. Видимо, поэтому у тебя не сработал фокус с DDX_Control: DoDataExchange вызывается именно из OnInitDialog базового класса. Непонятно, откуда вылет, да еше и не в отладчик, а вообще. Посмотри, что у тебя в pList перед вызовом SetItemText. Но вообще, ты бы навел порядок с переменными и контролами. Не через GetDlgItem и т.д., а заведи себе переменные для контролов, к которым часто обращаешься, и свяжи через DDX_COntrol. Легче будет разобраться в этой каше... Ну а потом, если эффект не исчезнет, ищи источник: комментируй все, кроме обращений с ListCtrl, и добейся, чтобы работало. Потом по-немногу открывай. Кто-то где-то кого-то ... |
| Автор: NewLine 23.5.2006, 11:45 |
| Я добавил в конец OnInitDialog строчку (return CDialog::OnInitDialog();) не знаю правильно это или нет, но все заработало. Спасибо. |
| Автор: Earnest 23.5.2006, 16:56 |
| Правильнее будет добавить в начало. То что возвращает базовый метод, можно игнорировать (FALSE вовсе не означает, что инициализация не удалась). Почему: если ты все же будешь использовать переменные-контролы класса, то использовать их можно только после вызова базового OnInitDialog. |