ComboBoxDataBind





4.00/5 (4投票s)
2002年12月29日
3分钟阅读

89351

2139
一个可调整大小的组合框,
引言
我有一个需求,需要在一个组合框中显示来自 MSAccess 数据库的大约 5000 条记录的庞大数据集。此外,它还需要在同一个对话框中包含几个相同组合框的副本。即使数据检索时间较短,将所有 5000 条记录添加到 4 到 5 个具有排序样式的组合框所需的时间却相当长,并成为一个瓶颈。
由于所有组合框使用的数据相同,并且检索到的数据已按排序顺序排列,因此在运行排序循环时,我不希望在所有组合框中复制数据。因此,我想出了接口IComboBox
,所有组合框都使用它来显示数据。已实现的接口可以在运行时从任何地方提供数据,例如从数据库等。不要使用CComboBox
指针直接向组合框添加和删除数据。使用CComboBoxDataBind
类,该类依次将所有调用委托给IComboBox
接口。
例如,如果您使用的是字符串数组或 10000 条记录,则添加、删除和更新操作都应通过字符串数组进行,并且必须相应地通过IComboBox
接口使用字符串数组在运行时提供数据。对于大约 50000 条记录的数据集,这非常有效,并且启动时间的初始开销不大。
一个有用的功能是调整大小的下拉列表。滚动条上的右上角和右下角 5 个像素的正方形区域是可以用来调整下拉列表大小的敏感区域。指示该功能的方式不太用户友好,但功能正常。
建议可在哪些情况下使用
在决定使用此组合框之前,您需要问几个问题您的数据集有多大?
我建议仅对大型数据集使用此方法。
您的数据集在运行时如何变化,即插入/更新/删除?
如果数据集是从前端动态变化的,并且需要重新排序,我建议使用默认的 Windows 组合框。否则,您需要更多地关注数据修改函数AddString
、InsertString
、DeleteString
。
您的数据修改是同步的还是异步的?
如果您的数据在后端异步更改,CComboBoxDataBind
是一个非常好的选择。例如,数据库中的一个列。您无需过多担心数据修改,可以直接连接到数据库并动态提供接口。
您的数据已排序吗?您希望组合框对数据进行排序吗?
不支持排序。如果您需要组合框对数据进行排序,我建议使用默认的 Windows 组合框。
您的 GUI 中是否有多个相同组合框的副本?
如果您有多个相同组合框的副本,这是一个正确的选择。只需对所有组合框使用同一个数据对象。
演示
演示项目演示了如何使用三种不同的样式使用CComboBoxDataBind
。第一个使用默认功能,第二个设置为在获得焦点时弹出,第三个用作始终在子项上弹出。所有组合框都使用单个数据集。
运行应用程序时,确保您在当前工作目录中拥有wordlist.txt文件。wordlist.txt包含按排序顺序排列的英语字典单词列表,大约 70000 个单词。wordlist.txt的第一行包含文件中的单词数量。
ComboData.h和ComboData.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