Предоставление текущего индекса выбора комбо для класса 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так что у вас есть доступ и здесь.

Другие вопросы по тегам