公开 CGridCellCombo class 的当前组合选择索引
Exposing the current combo selection index for the CGridCellCombo class
多年来我一直在使用 CGridCellCombo class. It is designed to be used with the CGridCtrl。
几年前,我确实在评论部分提出了一个 enhancement 的请求,但我没有得到回复。
CGridCellCombo
的基本概念是它使用单元格的文本值。因此,当您显示下拉列表时,它将选择该值。一般情况下这样就可以了。
但我在某些地方使用组合作为下拉列表。在某些情况下,继续使用文本值作为中间值是完全可以的。
但在某些情况下,知道组合的实际选定索引会是理想的选择。当我有一个下拉列表并且它被翻译成 30 种语言时,我需要知道索引,我别无选择,只能加载该翻译的可能选项,然后检查单元格值,并根据我在数组中找到的值知道索引。
它可以工作,但不是很优雅。我确实花了一些时间试图通过向 CInPlaceList
添加一个变量并设置它来跟踪选定的索引但是。然后,我向 CGridCellCombo
到 return 该值添加了一个包装器方法。但是没用。
我想知道这里是否有人对 CGridCellCombo
class 有很好的理解,并且可以建议我公开 CComboCell::GetCurSel
值。
我知道 CGridCtrl
已经很老了,但我并没有离开为 MFC 设计的另一个灵活的网格控件。
传回 CGridCtrl
的值在 CInPlaceList::EndEdit
中选择。使用内部消息GVN_ENDLABELEDIT
,此消息始终使用文本将其设置到网格中。
此处的值是通过 GetWindowText
从控件中获取的。随意覆盖此行为。
处理程序 CGridCtrl::OnEndInPlaceEdit
再次调用 OnEndEditCell
。全部取一个字符串从GVN_ENDLABELEDIT
.
发送
当您想要在内部值和选定值之间产生差异时,您必须通过重写绘图和选择来管理它。网格中的值是 GetCurSel
值,你必须显示一些不同的东西......在当前代码中没有太多处理要更改。
更多信息
关键是CInPlaceList::EndEdit()
。有调用GetWindowText
(CInPlaceList
是从CComboBox
派生出来的),这里获取索引即可。同样在 CGridCellCombo::EndEdit
中,您可以访问 m_pEditWnd
,即从 CComboBox
派生的 CInPlaceList
对象,因此您也可以在这里访问。
我发现这是最简单的解决方案:
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;
}
多年来我一直在使用 CGridCellCombo class. It is designed to be used with the CGridCtrl。
几年前,我确实在评论部分提出了一个 enhancement 的请求,但我没有得到回复。
CGridCellCombo
的基本概念是它使用单元格的文本值。因此,当您显示下拉列表时,它将选择该值。一般情况下这样就可以了。
但我在某些地方使用组合作为下拉列表。在某些情况下,继续使用文本值作为中间值是完全可以的。
但在某些情况下,知道组合的实际选定索引会是理想的选择。当我有一个下拉列表并且它被翻译成 30 种语言时,我需要知道索引,我别无选择,只能加载该翻译的可能选项,然后检查单元格值,并根据我在数组中找到的值知道索引。
它可以工作,但不是很优雅。我确实花了一些时间试图通过向 CInPlaceList
添加一个变量并设置它来跟踪选定的索引但是。然后,我向 CGridCellCombo
到 return 该值添加了一个包装器方法。但是没用。
我想知道这里是否有人对 CGridCellCombo
class 有很好的理解,并且可以建议我公开 CComboCell::GetCurSel
值。
我知道 CGridCtrl
已经很老了,但我并没有离开为 MFC 设计的另一个灵活的网格控件。
传回 CGridCtrl
的值在 CInPlaceList::EndEdit
中选择。使用内部消息GVN_ENDLABELEDIT
,此消息始终使用文本将其设置到网格中。
此处的值是通过 GetWindowText
从控件中获取的。随意覆盖此行为。
处理程序 CGridCtrl::OnEndInPlaceEdit
再次调用 OnEndEditCell
。全部取一个字符串从GVN_ENDLABELEDIT
.
当您想要在内部值和选定值之间产生差异时,您必须通过重写绘图和选择来管理它。网格中的值是 GetCurSel
值,你必须显示一些不同的东西......在当前代码中没有太多处理要更改。
更多信息
关键是CInPlaceList::EndEdit()
。有调用GetWindowText
(CInPlaceList
是从CComboBox
派生出来的),这里获取索引即可。同样在 CGridCellCombo::EndEdit
中,您可以访问 m_pEditWnd
,即从 CComboBox
派生的 CInPlaceList
对象,因此您也可以在这里访问。
我发现这是最简单的解决方案:
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;
}