Предоставление текущего индекса выбора комбо для класса CGridCellCombo
В течение нескольких лет я использую класс CGridCellCombo. Он предназначен для использования с CGridCtrl.
Несколько лет назад я сделал запрос в разделе комментариев для улучшения, но я не получил ответов.
Основная концепция CGridCellCombo
является то, что он работает с текстовым значением ячейки. Таким образом, когда вы представляете выпадающий список, это значение будет выбрано. В нормальных условиях это нормально.
Но у меня есть места, где я использую комбо в качестве раскрывающегося списка. В некоторых ситуациях вполне приемлемо продолжать использовать текстовое значение в качестве посредника.
Но в некоторых ситуациях было бы идеально знать фактический выбранный индекс комбо. Когда у меня есть выпадающий список, и он переведен на 30 языков, и мне нужно знать индекс, у меня нет выбора, кроме как загрузить возможные варианты для этого перевода, а затем изучить значение ячейки и на основе значения, найденного в массиве I знать индекс.
Это работает, но не очень элегантно. Я потратил немного времени, пытаясь отследить выбранный индекс, добавив переменную в CInPlaceList
и установка его но. Затем я добавил метод-обертку в CGridCellCombo
чтобы вернуть это значение. Но это не сработало.
Я задавался вопросом, есть ли у кого-нибудь здесь хорошее понимание CGridCellCombo
класс и может быть в состоянии посоветовать мне в разоблачении CComboCell::GetCurSel
значение.
Я знаю что CGridCtrl
очень старый, но у меня нет другого гибкого элемента управления сеткой, предназначенного для MFC.
2 ответа
Я нашел это самое простое решение:
int CGridCellCombo::GetSelectedIndex()
{
int iSelectedIndex = CB_ERR;
CString strText = GetText();
for (int iOption = 0; iOption < m_Strings.GetSize(); iOption++)
{
if (strText.CollateNoCase(m_Strings[iOption]) == 0) // Match
{
iSelectedIndex = iOption;
break;
}
}
return iSelectedIndex;
}
Значение, которое передается обратно в CGridCtrl
выбран в CInPlaceList::EndEdit
, Внутреннее сообщение GVN_ENDLABELEDIT
используется, и это сообщение всегда использует текст, чтобы установить его в сетке.
Значение берется здесь через GetWindowText
от контроля. Не стесняйтесь переписать это поведение.
Обработчик CGridCtrl::OnEndInPlaceEdit
снова звонит OnEndEditCell
, Все берут строку от GVN_ENDLABELEDIT
,
Если вы хотите провести различие между внутренним значением и выбранным значением, вы должны управлять этим путем переписывания чертежа и выбора. Значение в сетке является GetCurSel
значение, и вы должны показать что-то другое... В текущем коде нет большой обработки по этому поводу, чтобы изменить.
Дополнительная информация
Ключ CInPlaceList::EndEdit()
, Есть звонок в GetWindowText
(CInPlaceList
происходит от CComboBox
), просто получите индекс здесь. Также в CGridCellCombo::EndEdit
у вас есть доступ к m_pEditWnd
, это CInPlaceList
объект и полученный из CComboBox
так что у вас есть доступ и здесь.