文档库 最新最全的文档下载
当前位置:文档库 › (已读)第十二章 列表框和组合框

(已读)第十二章 列表框和组合框

(已读)第十二章 列表框和组合框
(已读)第十二章 列表框和组合框

第十二章列表框和组合框

列表框是显示一系列项供用户选择的控件,对选中的项可以进行后续的处理。用户选择可以是多项的,但本章的例程设计为单选的。组合框是一个编辑框带一个可以下拉的列表框,用户在下拉框中选择的项会进入编辑框中,再进行后续处理,选择也可以用键盘的光标键。在编辑框中也可以直接输入。

本章要点

1 列表框的设计、项的添加和删除

2 组合框的设计和使用

12.1 ListCombo程序运行时的界面和功能

chap12-01

List1在初始化时加入了六项。点击[<]按钮就把选中的项移动到List2中去。点击[>]按钮则相反。点击[<<]和[>>]按钮则移动全部项。用[清除列表]按钮可删除List1的全部项。[加入到]按钮把你选中的在编辑框中项添加到List1中,[加入全部]按钮则把组合框设置的所有项添加到List1中。组合框预置了“中国”这一项,但没有设计删除功能。列表框和组合框都有一个从0开始的整数索引和一个用于显示的文本。

12.2 对话框界面设计

按控件属性表设计界面。

属性表中列出的表示“选中”,TAB复选框都要选中,就省略了。组合框可以在DATA属性页中设置项的文本,本例采用这种方法。其数据是:

中国,美国,俄罗斯,英国,法国,德国,印度,巴基斯坦,

日本,加拿大,澳大利亚,韩国,伊朗,伊拉克

逗号处要改为换行,换行用Ctrl+<回车键>。设计好的界面如图chap12-02所示。

chap12-02

12.3 设计变量和编写代码

1 为三个列表框和组合框引进变量

因为我们要对列表框的项进行操作,所以要申明三个对象类型的变量

m_myList1

m_myList2

m_myCombo。

2 定义一个字符串数组

定义一个字符串数组m_myItems用来存放组合框的项的文本。在对话框的头文件的类CListCombaDlg的构造函数中申明:

CString m_myItems[20];

3 给初始化函数编写代码

在OnInitDialog()中我们要从组合框控件获取项目的文本,给字符串数组m_myItems赋值。再用它的前六项为List1初始化。最后为组合框设置项“中国”为预选项。

从组合框控件获取项用函数GetLBText(index, str),它把索引值为index的项的文本拷贝给str。给列表框赋值用AddString(string)函数,它在列表的尾部增加一项。类似地还可以用插入函数InsearString(...)。在// TODO: Add extra initialization here 这行的后面,我们添加如下代码:

int count = m_myCombo.GetCount();//获取组合框的项数

int i =0;

//从组合框控件获取项的文本

for(i =0; i

m_myCombo.GetLBText(i, m_myItems[i]);

//List1初始化,六项

for(i =0; i<6 ; i++)

m_myList1.AddString(m_myItems[i]);//130) : error C2039: 'AddString' : is not a member of 'CString'变量类型有问题

//设置组合框默认选择项为"中国"

m_myCombo.SetCurSel(0);

这段调了很久

4 给4个移动按钮写代码

MOVE按钮[<]的功能是从List1中得到用户选定顶的索引号,再从这索引号获取选定顶的文本,然后删除这一项,在List2中添加一项。当前项获取索引号函数 index=GetCurSel()返回整数。获取选定项的文本用函数GetText(index, item),它把指定项的文本拷贝到字符串item中。OnMoveButton()函数的完整代码如下:

void CListCombaDlg::OnMoveButton()

{

CString item;

int index = m_myList1.GetCurSel();//获取选定顶索引号

m_myList1.GetText(index, item); //获取选定顶的文本

m_myList1.DeleteString(index);//删除一项

m_myList2.AddString(item); //添加到List2中

m_myList1.SetCurSel(0); //设置首项为当前项

}

MOVEALL按钮的代码与上面的类似,加上循环语句就行。

void CListCombaDlg::OnMoveallButton()

{

// TODO: Add your control notification handler code here

CString item;

int index =0 ;

while(m_myList1.GetCount() >0){

m_myList1.GetText(0, item);

m_myList1.DeleteString(0);

m_myList2.AddString(item);

};

}

BACK和BACKALL按钮的代码和上面的一样,只要把m_myList1和m_myList2对调就行。

5 从组合框向列表框1加入当前项的代码

这与列表框不同的是获取文本的函数名不大一样,用函数GetLBText,其余都相同。在OnAddButton()中加入代码:

void CListComboDlg::OnAddButton()

{

CString item;

int i=m_myCombo.GetCurSel();

m_myCombo.GetLBText(i,item);

m_myList1.AddString(item);

}从组合框向列表框1加入全部项的代码如下:

void CListCombaDlg::OnAddallButton()

{

//Clear old items in Linst at first

CString item;

while(m_myList1.GetCount()>0)

m_myList1.DeleteString(0);

int n = m_myCombo.GetCount();

//Add all items

for(int i=0; i

m_myCombo.GetLBText(i, item);

m_myList1.AddString(item);

}

}

6 [清除列表]和[退出]按钮的代码

[清除列表]的按钮的代码:

while(m_myList1.GetCount()>0)

m_myList1.DeleteString(0);

[退出]按钮的代码: OnOK();

12.4 编译和运行

至此,我们完成了界面设计和代码编写,可以编译和Build了。编译通过就可以在运行中测试程序,检查是否满足我们的设计要求。但是,代码编写常常会有许多错误,编译器会报告一大堆错误。虽然指出了错误所在的行,但要明白是什么错误还是很费劲的。如果我们在完成一部分工作后就编译一次,错误就比较少,容易找到和纠正。所以我们分以下几步来编译。

1、界面完成后编译一次,这时运行可以看到组合框有了信息和可以选择了。

2、对话框初始化编写后编译和运行一次,这时可以看到列表框有了信息。

3、MOVE按钮写了代码后编译和运行一次,这时可以测试移动功能是否正确。如果成功,那这代码可以放心地复制到其他三个按钮去了。

4、全部完成后的编译和运行。

12.5 小结

1 列表框和组合框属性设置中有类型选择

组合框有三种情况:Simple, Dropdown, Drop List。Simple类型的组合框的列表框部分是固定显示的,不能下拉;而其余两种带一个下拉手柄。设计中别忘记添加滚动条。Dropdown与Drop List 的区别是后者的编辑框不能输入。列表框也有三种情况:Simple, Multiple, Extended,它们决定了用户选取项的方法。Simple模式只能够选取单项,Multiple模式可以按Ctrl键+鼠标左键选取多个项,而Extended则可以通过鼠标拖处矩形一次选取连续的项,也可以加按Ctrl键作多次选择。

2 列表框在属性页不能设置项的文本(字符串),而组合框能。

3 列表框和组合框中的“项”都有索引号(0,1,2,...)和文本(在窗口显示)。两者都有成员函数来获取和设置这些信息。得到文本的函数名称不一样,列表框是GetText(),组合框是GetLBText()。字母LB的意思是ListBox,GetLBText的意思是“从自身的列表框中获取文本”。

4 列表框和组合框常用的几个函数原型

列表框的取索引号和文本的函数原型

获取文本:

void GetText( int nIndex, CString& rString ) const;

用于单选模式的获取和设置索引号:

int GetCurSel( ) const;

int SetCurSel( int nSelect );

用于多选模式的:

int GetSel( int nIndex ) const;

上式如果nIndex项是被选中的,就返回它的索引号,否则返回0。

int SetSel( int nIndex, BOOL bSelect = TRUE );

bSelect = TRUE就选中索引为nIndex的项,如是FALSE,则取消“选中”:如果nIndex=-1,就是全“选中”或全“不选中”。

组合框的获取索引号和文本的函数原型

int GetCurSel( ) const;

int SetCurSel( int nSelect );

void GetLBText( int nIndex, CString& rString ) const;

添加、插入和删除项的函数原型

int AddString( LPCTSTR lpszItem );

int InsertString( int nIndex, LPCTSTR lpszItem );

int DeleteString( UINT nIndex );

习题和思考

1 重新创建MListCombo,把两个列表框设计为多选项的。

2 重新创建EListCombo,把两个列表框设计为可扩展选项的。

jQuery实现仿百度搜索时的下拉列表

当我们使用百度或是谷歌进行搜索时,只要输入一个字母就可以产生一个下拉列表,并且可以通过键盘上下键来控制列表项的选择。最近在项目中也碰到了类似的情况,在文本框中输入某个字母就可以出现一个下拉列表,展现从数据库里搜索过来的结果。 AD: 先说一下我的实现思路吧,当用户在文本框中输入时,可以利用ajax方式将文本框内内容传给后台的某个页面,在那个页面中经过处理后将产生的结果(这里的结果是一个字符串数组)再获取过来在前台呈现。有了思路后就开始考虑怎么去具体实现吧。首先要使用ajax的话,就想到可以使用jQuery提供的$.post()方法,这个方法可带4个参数,分别是: ·url,请求的页面URL地址; ·data(可选),作为HTTP消息的实体内容发送给服务器; ·callback(可选),载入成功后的回调函数,自动将请求结果和状态传递给该方法; ·type(可选),服务器端返回的数据格式,可以是:xml、html、script、json等。 好,现在对$.post()方法有了一定的了解,现在就可以考虑这个方法该怎么来写了。在我的项目中,请求的URL地址是@Url.Action("GetTags")(由于是https://www.wendangku.net/doc/f916817309.html, MVC架构,地址是由Routing配置产生的,这个转义到前台就是一个普通的URL地址),需要传送的是ID为newTag的文本框中的值,所以第二个参数为{pinyins: $("#newTag").val()},这里的pinyins是由后台定义的。第三个参数callback是处理请求成功后要做的事,暂且命名为pinyinCallback,第四个参数设为'json',即数据格式为一个JSON对象。这样的话,这个ajax请求可以写为: 1.$.post('@Url.Action("GetTags")', { pinyins: $("#newTag").val() }, piny inCallback, 'json'); 但是如果用户每输入一个字母就立即往服务器传的的话,服务器的承载就会过大,于是考虑可以将每次请求延迟一秒发送,于是发送请求的方法可以这样定义: 1.function pinyinOption() { 2. var t = setTimeout(function () { 3. $.post('@Url.Action("GetTags")', { pinyins: $("#newTag").v al() }, pinyinCallback, 'json'); 4. }, 1000); 5. 6. }

自写select下拉框,样式随意改

资讯管理