Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Редактирование CListView, Как отредактир. любую ячейку в CListView 
:(
    Опции темы
GGoga
Дата 27.6.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



Здравствуйте, уважаемые господа программисты!!!

Хочу проконсультироваться и найти свою ошибку. Я программно создаю элемент типа CMyListView, который я унаследовал от CListView с флагами:

Код

GetListCtrl().ModifyStyle( 0, LVS_REPORT | LVS_EDITLABELS);
GetListCtrl().SetExtendedStyle(LVS_EX_FLATSB | 
             LVS_EX_FULLROWSELECT | 
             LVS_EX_HEADERDRAGDROP | 
             LVS_EX_GRIDLINES | 
             GetListCtrl().GetExtendedStyle() );
 


После чего создаю обработчик для завершения редактирования:


Код

...
BEGIN_MESSAGE_MAP(CMyListView, CListView)
...
    ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEditLabelTab)
...
END_MESSAGE_MAP()
...

// И сам обработчик:
...
void CMyListView::OnEditLabelTab(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    CString sEdit = pDispInfo->item.pszText;
        if(!sEdit.IsEmpty())
            GetListCtrl().SetItemText(pDispInfo->item.iItem, m_nEdit, sEdit);

    m_nEdit = -1;
    GetListCtrl().SetItemState(pDispInfo->item.iItem, 0, LVNI_FOCUSED | LVNI_SELECTED);
    *pResult = 0;
}
...
 


Только вот когда я вывожу информацию в таблицу и щелкаю левой кнопкой мыши на какой-нибудь ячейке, то доступной для редактирования стает всегда ячейка из первой колонки выбранной строки. А мне нужно, чтобы становилась доступной та ячейка, на которую я непосредственно щелкнул мышкой.

Подскажите, можно ли так сделать, если можно то как?

Заранее, СПАСИБО!
PM MAIL ICQ Skype   Вверх
Coocky
Дата 27.6.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Не все так просто smile
Вот. Редактируй. Тренируйся.

Добавлено @ 15:10
И еще-СОВЕТУЮ НАСТОЯТЕЛЬНО пользоваться поиском. Тема не раз обсуждалась. Уже и раскрашивали и вставляли и редактировали все что угодно. Причем давно smile

Это сообщение отредактировал(а) Coocky - 27.6.2007, 15:10

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  31.zip 29,11 Kb


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
GGoga
Дата 27.6.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



Цитата(Coocky @ 27.6.2007,  15:08)
Не все так просто smile
Вот. Редактируй. Тренируйся.

Добавлено @ 15:10
И еще-СОВЕТУЮ НАСТОЯТЕЛЬНО пользоваться поиском. Тема не раз обсуждалась. Уже и раскрашивали и вставляли и редактировали все что угодно. Причем давно smile

Спасибо Вам!!! Вы меня просто таки выручаете!!!

Конечно, со Студией разобраться тяжеловато. Тем более, если в кратчайшие сроки нужно реализовать поставленное задание. Привык уже к Билдеру, поэтому и идеология немного другая у меня, подход немного не тот, ну в принципе "...ничего нет невозможного... даже зайца можно научить курить..." - главное желание и терпение!
PM MAIL ICQ Skype   Вверх
GGoga
Дата 27.6.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



Можно еще задать такой вопрос. Я вот разобрался с Вашим примером, написал свой обработчик, только когда я щелкаю левой кнопкой миши на редактируемом поле у меня появляется поле для редактирования и автоматически пропадает строка из первой колонки редактируемой строки.
Я не брал из примера функцию DrawItem, поскольку мне не надо раскрашивать элементы, а вот пример по началу и окончанию редактирования мне очень помог.

Но вот почему пропадает первый элемент, мне не понятно??? Хотя после окончания редактирования он появляется??? Парадокс какой-то.

Вот мой код, может Вы найдете в нем ошибку?

Код

// При начале редактирования
void CMyListView::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    CPoint posMouse;
        GetCursorPos(&posMouse);
        ScreenToClient(&posMouse);
    LV_HITTESTINFO htest;
    htest.pt = posMouse;
    htest.flags = 0;
    CRect rcItem;
    
    this->GetListCtrl().SubItemHitTest(&htest);

    HWND hWnd = (HWND)SendMessage(LVM_GETEDITCONTROL);
    ASSERT(hWnd != NULL);
    VERIFY(m_LVEdit.SubclassWindow(hWnd));
    
    this->GetListCtrl().GetSubItemRect(htest.iItem, htest.iSubItem, LVIR_LABEL, rcItem);

    m_LVEdit.m_x = rcItem.left;
    m_LVEdit.m_y = rcItem.top-1;
    m_LVEdit.m_cy = rcItem.Height();
    m_LVEdit.m_cx = rcItem.Width();
    
    m_LVEdit.MoveWindow(rcItem, true);
    m_LVEdit.SetWindowText(this->GetListCtrl().GetItemText(htest.iItem, htest.iSubItem));
    m_nEdit = htest.iSubItem;    
    *pResult = 0;
}

// В конце редактирования
void CMyListView::OnEditLabelTab(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    CString sEdit = pDispInfo->item.pszText;
        if(!sEdit.IsEmpty())
            this->GetListCtrl().SetItemText(pDispInfo->item.iItem, m_nEdit, sEdit);

    m_nEdit = -1;
    this->GetListCtrl().SetItemState(pDispInfo->item.iItem, 0, LVNI_FOCUSED | LVNI_SELECTED);
    *pResult = 0;
}

// При щелчке левой кнопкой мыши на редактируемой ячейке
void CMyListView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default

    CListView::OnLButtonDown(nFlags, point);
    CListView::SendMessage(LVM_EDITLABEL, (WPARAM)this->GetListCtrl().HitTest(point, NULL), 0);
}


Откуда такой глюк, я не пойму, может здесь что-то не то написано?

Заранее СПАСИБО!!!
PM MAIL ICQ Skype   Вверх
Earnest
Дата 27.6.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Поскольку это трюк, призванный обмануть бедный доверчивый Виндоус, который стандартно обещал редактировать только первую колонку, то удивляться разным косякам не приходится. Попробуй принудительно восстанавливать текст в первой колонке, если редактируешь не ее, на BeginEditLabel.


--------------------
...
PM   Вверх
GGoga
Дата 27.6.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



Цитата(Earnest @ 27.6.2007,  17:24)
Поскольку это трюк, призванный обмануть бедный доверчивый Виндоус, который стандартно обещал редактировать только первую колонку, то удивляться разным косякам не приходится. Попробуй принудительно восстанавливать текст в первой колонке, если редактируешь не ее, на BeginEditLabel.

Да пробовал, только не получается :( В этом событие восстановление данных ячейки как-то не реализуется, пробовал восстанавливать на нажатие кнопок мыши - тоже не получается, наверное что-то другое надо сделать... Только вот что??? Вот в этом то и проблема...
PM MAIL ICQ Skype   Вверх
zkv
Дата 28.6.2007, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



Цитата(GGoga @  27.6.2007,  20:30 Найти цитируемый пост)
Да пробовал, только не получается

переводится так: "не хочу думать, искать примеры, пытаться что-то сделать, хочу готовое решение"

Что именно не получается?
PM MAIL   Вверх
GGoga
Дата 28.6.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



Цитата(zkv @ 28.6.2007,  02:06)
Цитата(GGoga @  27.6.2007,  20:30 Найти цитируемый пост)
Да пробовал, только не получается

переводится так: "не хочу думать, искать примеры, пытаться что-то сделать, хочу готовое решение"

Что именно не получается?

Да, именно не хочеться искать примеры и думать!!! Если бы мне было в лом что-то делать и разбираться, я бы не сидел на форумах и не перечитывал различные книжки! А что касается примеров, то как, например можно разобраться в куске кода, который написал другой чел и нету комментариев? Погрузиться в его размышления и логику? Для меня, как человека, начавшего разбираться с программированием в Студие месяц назад - это тяжело и знакомых программеров нету, с кем можно было бы посоветоваться, вот и приходиться спрашивать на форумах...

Я не знаю, может быть Вы гений (не хочу Вас обидеть, если что, то извините) и как только сели писать программы, то уже в голове перебирали машинные коды, то я так не могу (просто туповат я немного smile )...

А не получается конкретно на обработчике событий OnBeginLabelEdit восстановить значение первой ячейки, причем если я загоняю ее содержимое в экземпляр CString и вывожу в сообщении на экран, то все нормально, а если пытаюсь записать в ячейку, то все равно безрезультатно, она остается пустой...

Пробовал и на двойном щелчке мыши восстанавливать (редактирование ячейки именно на двойной щелчек в моем проекте) - не получается, а где еще можно это сделать или как я не знаю...
PM MAIL ICQ Skype   Вверх
zkv
Дата 28.6.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



GGoga, ну может я немного резковато выразился, просто когда человек говорит "у меня не получается", не показывая никаких наработок в виде кода, создается ощущение, что сам он ничего и не пытался сделать. Когда человек делает, то у него появляются конкретные вопросы типа: 
Цитата

Попробовал так:
    
char ss[20] = TEXT("dsbgv");
AfxMessageBox(ss, MB_OK);

и так
    
char ss[20] = _T("dsbgv");
AfxMessageBox(ss, MB_OK);

В результате:
e:\batfile\programms\visual c++\embadeddb\embadeddbview.cpp(334) : error C2440: 'initializing' : cannot convert from 'const wchar_t [6]' to 'char [20]'
        There is no context in which this conversion is possible

 smile 
Так что не получается?
PM MAIL   Вверх
GGoga
Дата 28.6.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



Цитата(zkv @ 28.6.2007,  13:49)
GGoga, ну может я немного резковато выразился, просто когда человек говорит "у меня не получается", не показывая никаких наработок в виде кода, создается ощущение, что сам он ничего и не пытался сделать. Когда человек делает, то у него появляются конкретные вопросы типа: 
Цитата

Попробовал так:
    
char ss[20] = TEXT("dsbgv");
AfxMessageBox(ss, MB_OK);

и так
    
char ss[20] = _T("dsbgv");
AfxMessageBox(ss, MB_OK);

В результате:
e:\batfile\programms\visual c++\embadeddb\embadeddbview.cpp(334) : error C2440: 'initializing' : cannot convert from 'const wchar_t [6]' to 'char [20]'
        There is no context in which this conversion is possible

 smile 
Так что не получается?

Да, я, наверное, тоже по тупому вопрос задал smile

В общем проблемка следующая: я в проекте создаю объект CListView в виде таблицы, куда потом записываю разную информацию, которую в дальнейшем требуется отредактировать. Так вот, когда я начинаю редактировать (данное событие происходит при двойном щелчке левой кнопки мыши на ячейке таблицы) ячейку (особенно если она эта ячейка не из первого столбца строки), то значение (текст) в ячейке первого столбца данной строки исчезает и появляется по окончанию редактирования.

Вот значит код реализации:

Код

...
// При двойном щелчке левой кнопки мыши на ячейке
void CMyListView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    CListView::OnLButtonDown(nFlags, point);
    CListView::SendMessage(LVM_EDITLABEL, (WPARAM)this->GetListCtrl().HitTest(point, NULL), 0);
}

...
// При начале редактирования
void CMyListView::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    CPoint posMouse;
        GetCursorPos(&posMouse);
        ScreenToClient(&posMouse);
    LV_HITTESTINFO htest;
    htest.pt = posMouse;
    htest.flags = 0;
    CRect rcItem;

    this->GetListCtrl().SubItemHitTest(&htest);

    HWND hWnd = (HWND)SendMessage(LVM_GETEDITCONTROL);
    ASSERT(hWnd != NULL);
    VERIFY(m_LVEdit.SubclassWindow(hWnd));

    this->GetListCtrl().GetSubItemRect(htest.iItem, htest.iSubItem, LVIR_LABEL, rcItem);

    m_LVEdit.m_x = rcItem.left;
    m_LVEdit.m_y = rcItem.top-1;
    m_LVEdit.m_cy = rcItem.Height();
    m_LVEdit.m_cx = rcItem.Width();

    m_LVEdit.MoveWindow(rcItem, true);
    m_LVEdit.SetWindowText(this->GetListCtrl().GetItemText(htest.iItem, htest.iSubItem));
    m_nEdit = htest.iSubItem;    
    *pResult = 0;
}

...
// По окночанию редактирования
void CMyListView::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    CString sEdit = pDispInfo->item.pszText;
        if(!sEdit.IsEmpty())
            this->GetListCtrl().SetItemText(pDispInfo->item.iItem, m_nEdit, sEdit);

    m_nEdit = -1;
    this->GetListCtrl().SetItemState(pDispInfo->item.iItem, 0, LVNI_FOCUSED | LVNI_SELECTED);
    *pResult = 0;
}



Это моя реализация. Я пробовал так, как посоветовал(а) мне сделать Earnest в начале редактирования (OnBeginLabelEdit) и добавил следующий код (выделен жирным):
Код

void CMyListView::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    CPoint posMouse;
        GetCursorPos(&posMouse);
        ScreenToClient(&posMouse);
    LV_HITTESTINFO htest;
    htest.pt = posMouse;
    htest.flags = 0;
    CRect rcItem;

    this->GetListCtrl().SubItemHitTest(&htest);
[color=red]
    // Получить значение ячейки
    CString ItemString(this->GetListCtrl().GetItemText(htest.iItem, 0));
    // Вывести его на экран
    AfxMessageBox((LPCTSTR)ItemString, MB_OK);
    // Установить данное значение в ячейке снова
    this->GetListCtrl().SetItemText(htest.iItem, 0, (LPCTSTR)ItemString);
[/color]  
    HWND hWnd = (HWND)SendMessage(LVM_GETEDITCONTROL);
    ASSERT(hWnd != NULL);
    VERIFY(m_LVEdit.SubclassWindow(hWnd));

    this->GetListCtrl().GetSubItemRect(htest.iItem, htest.iSubItem, LVIR_LABEL, rcItem);

    m_LVEdit.m_x = rcItem.left;
    m_LVEdit.m_y = rcItem.top-1;
    m_LVEdit.m_cy = rcItem.Height();
    m_LVEdit.m_cx = rcItem.Width();

    m_LVEdit.MoveWindow(rcItem, true);
    m_LVEdit.SetWindowText(this->GetListCtrl().GetItemText(htest.iItem, htest.iSubItem));
    m_nEdit = htest.iSubItem;    
    *pResult = 0;
}


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

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

Буду рад любому совету или подсказке!
Заранее ОГРОМНОЕ СПАСИБО smile

В следующем сообщении приведу скрин-шоты с примером корявой работы приложения...

Добавлено через 4 минуты и 57 секунд
Вот скрин-шоты:


Это сообщение отредактировал(а) GGoga - 28.6.2007, 15:57

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Screen_1.rar 34,90 Kb
PM MAIL ICQ Skype   Вверх
GGoga
Дата 28.6.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



И с глюками:


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Screen_2.rar 89,35 Kb
PM MAIL ICQ Skype   Вверх
GGoga
Дата 29.6.2007, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.5.2007
Где: Харьков

Репутация: нет
Всего: нет



Проблему решил, использовал исходники класса CFListCtrl (). Написал его умный чел - Денис Солоненков, за что ему ОГРОМНОЕ СПАСИБО!!!

Вот здесь все описано:
http://rsdn.ru/article/files/Classes/cflist2.xml

А вот и сам демонстрационный проект:


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  cflist2_source.zip 43,05 Kb
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.