65.9K
CodeProject 正在变化。 阅读更多。
Home

ComboBoxDataBind

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (4投票s)

2002年12月29日

3分钟阅读

viewsIcon

89351

downloadIcon

2139

一个可调整大小的组合框,可以通过接口绑定数据。


引言

我有一个需求,需要在一个组合框中显示来自 MSAccess 数据库的大约 5000 条记录的庞大数据集。此外,它还需要在同一个对话框中包含几个相同组合框的副本。即使数据检索时间较短,将所有 5000 条记录添加到 4 到 5 个具有排序样式的组合框所需的时间却相当长,并成为一个瓶颈。

由于所有组合框使用的数据相同,并且检索到的数据已按排序顺序排列,因此在运行排序循环时,我不希望在所有组合框中复制数据。因此,我想出了接口IComboBox,所有组合框都使用它来显示数据。已实现的接口可以在运行时从任何地方提供数据,例如从数据库等。不要使用CComboBox指针直接向组合框添加和删除数据。使用CComboBoxDataBind类,该类依次将所有调用委托给IComboBox接口。

例如,如果您使用的是字符串数组或 10000 条记录,则添加、删除和更新操作都应通过字符串数组进行,并且必须相应地通过IComboBox接口使用字符串数组在运行时提供数据。对于大约 50000 条记录的数据集,这非常有效,并且启动时间的初始开销不大。

一个有用的功能是调整大小的下拉列表。滚动条上的右上角和右下角 5 个像素的正方形区域是可以用来调整下拉列表大小的敏感区域。指示该功能的方式不太用户友好,但功能正常。

建议可在哪些情况下使用

在决定使用此组合框之前,您需要问几个问题

您的数据集有多大?

我建议仅对大型数据集使用此方法。

您的数据集在运行时如何变化,即插入/更新/删除?

如果数据集是从前端动态变化的,并且需要重新排序,我建议使用默认的 Windows 组合框。否则,您需要更多地关注数据修改函数AddStringInsertStringDeleteString

您的数据修改是同步的还是异步的?

如果您的数据在后端异步更改,CComboBoxDataBind 是一个非常好的选择。例如,数据库中的一个列。您无需过多担心数据修改,可以直接连接到数据库并动态提供接口。

您的数据已排序吗?您希望组合框对数据进行排序吗?

不支持排序。如果您需要组合框对数据进行排序,我建议使用默认的 Windows 组合框。

您的 GUI 中是否有多个相同组合框的副本?

如果您有多个相同组合框的副本,这是一个正确的选择。只需对所有组合框使用同一个数据对象。

演示

演示项目演示了如何使用三种不同的样式使用CComboBoxDataBind。第一个使用默认功能,第二个设置为在获得焦点时弹出,第三个用作始终在子项上弹出。所有组合框都使用单个数据集。

运行应用程序时,确保您在当前工作目录中拥有wordlist.txt文件。wordlist.txt包含按排序顺序排列的英语字典单词列表,大约 70000 个单词。wordlist.txt的第一行包含文件中的单词数量。

ComboData.hComboData.cpp实现了接口。演示中未实现数据添加、插入和删除。CComboBoxDataBind已通过droplist样式进行了测试。也适用于dropdown样式,但未经过彻底测试。

使用控件

数据绑定通过接口IComboBox进行。以下是需要实现的功能
virtual int GetCount()=0;
virtual CString GetString(int index)=0;
virtual DWORD GetItemData(int index)=0;
virtual void* GetItemDataPtr(int index)=0;
virtual BOOL IsSorted()=0;
virtual int AddString( LPCTSTR lpszString )=0;
virtual int DeleteString( UINT nIndex )=0;
virtual int InsertString( int nIndex, LPCTSTR lpszString )=0;
使用 DDX 将 MFC 向导创建的CComboBox控件绑定到CComboBoxDataBind变量。
CComboBoxDataBind m_ComboBoxDataBind1; // .h
DDX_Control(pDX, IDC_COMBO1, m_ComboBoxDataBind1); // .cpp / DoDataExchange

将已实现的IComboBox数据接口绑定到CComboBoxDataBind变量。

m_ComboBoxDataBind1.SetIComboBox(&m_ComboData); // .cpp / InitDialog
© . All rights reserved.