iampradeepsharma Ответов: 1

Значение элемента Listctrl не изменяется


Всем привет ,

У меня есть класс CListCtrl dervied, в котором я создал 3 столбца .Теперь, добавляя первую строку с помощью InsertItem, а затем устанавливая текст для каждого из этих столбцов, я могу отобразить эту строку .
Теперь я снова устанавливаю текст для его уже доступного списка ctrl item index, но на этот раз текст не обновляется .

Я использую API listCtrl.SetItemText ().
Я пробовал использовать API Update(),UpdateData (), но ни один из них не работал .

это похоже на :
sr.no состояние ввода вывода
Файл 1 file.txt .доб в прогресс

Таким образом, дело обстоит так, что listctrl показывает статус экспортируемого файла, теперь после экспорта я должен установить этот статус на "завершено".
Поэтому, когда я делаю это, это не меняет текст.

sr.no состояние ввода вывода
Файл 1 file.txt .доб завершен
Вот чего я хочу .


Может ли кто-нибудь сказать мне, как это сделать?

Что я уже пробовал:

Я попробовал update , updatadata api.

Richard MacCutchan

Пожалуйста, покажите свой код.

1 Ответов

Рейтинг:
0

Jochen Arndt

Проверьте возвращаемое значение CListCtrl::SetItemText[^]. Если это так FALSE, проверьте, если вы прошли действительный nItem (ряд и nSubItem (колонка) параметры.

Предполагая, что это первый ряд и Статус это 4-й столбец, он должен быть:

VERIFY(listCtrl.SetItemText(0, 3, _T("Completed")));
То VERIFY макрос вызовет утверждение в отладочных сборках при возврате вызова FALSE и ничего не делает в релизных сборках.

Если вызов проходит успешно, то нет необходимости обновлять список, потому что это будет сделано вызовом, если перерисовка не отключена. Или ты звонил listCtrl.SetRedraw(FALSE) раньше и забыли снова включить перерисовку?


iampradeepsharma

я думаю, что есть какая-то проблема, так как когда я помещаю какое-то окно сообщения вскоре после setitemtext, отображающего возвращаемое значение setitemtext, он показывает текст в этом столбце состояния, а когда я удаляю messagebox, он не отображается ? Есть ли какая-то проблема с обновлением окна ?

Jochen Arndt

Если содержимое ячейки отображается обновленным при открытии окна сообщения и больше не отображается при закрытии окна mesage, то существует только одна возможная причина:

Где-то в вашем коде элемент снова обновляется со старым значением после этого. Нет никаких системных действий, которые изменят элементы в фоновом режиме. Они изменяются только с помощью кода, написанного вами.

Но вы не показали никакого кода и даже не сказали нам, откуда (возможно, какой-то обработчик) вы обновляете элемент.

iampradeepsharma

Нет, даже после того, как я нажму на кнопку ok в messagebox, текст останется там . Только в том случае, когда messagebox не находится на месте, я не вижу текст в столбце состояния.

Jochen Arndt

ОК. Таким образом, окно сообщения запускает перерисовку списка. При нормальных условиях установка текста элемента приведет к аннулированию окна списка (или его части) и обновлению окна в режиме ожидания.

Чтобы принудительно перекрасить весь список используйте

Invalidate();
UpdateWindow();

Но в большинстве случаев в этом нет необходимости.

Опять же: откуда вы обновляете элемент?
Может ли он вызываться / запускаться из другого потока или асинхронного события, например из файловых операций?

Тогда, возможно, придется форсировать перерисовку. Но обратите внимание, что обновление элементов графического интерфейса при таких событиях должно быть обработано должным образом (есть некоторые подводные камни).