C++builder 怎么实现一个ComboBox控制另一个ComboBox
我定义了两个ComboBox,想让一个ComboBox来控制另一个ComboBox就是ComboBox1里Items里是a,b,c.ComboBox2里对应为a----1...
我定义了两个ComboBox,想让一个ComboBox来控制另一个ComboBox 就是ComboBox1 里Items里是a,b,c. ComboBox2里对应为a---- 1,2,3 b------甲、乙、丙
c--------A、B、C;
请问怎么实现~ 展开
c--------A、B、C;
请问怎么实现~ 展开
3个回答
展开全部
明白了,你想在第一个组合框ComboBox选择a时,第二个组合框中只填充1,2,3,即实现级联。
1、在组合框中填充内容有两种方法:
1)Comobo Box属性\数据:填入组合框内容,按Ctrl+Enter
2)在MFC ClassWizard中选中组合框ID,再选Messages ->CBN_SELCHANGE添加成员函数
并从数据库中读取要加入组合框中的列值。
如果你选的是第二种方法:
那么初始化第一个组合框内容时,不初始化第二个组合框里内容,并且在第一个组合框的OnSelchange...()函数中直接连接数据库,写sql语句读取第二个组合框内容要以第一个组合框变量为条件,实现两个组合框中内容的级联
举个例子:
目的是实现年级与班级的级联,选2007时,班级组合框中只有2007级班级编号
m_yearsel为第一个组合框变量(意为年级),m_clssel为第二个组合框变量(意为班级)m_yearsel.AddString("[无限定]");
cet.Format("select distinct(Class_Grade) from Classes");
m_AdoConn.GetRecordSet((_bstr_t)cet);
while(m_AdoConn.m_pRecordset->adoEOF==0)
{
m_yearsel.AddString(_T((char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("Class_Grade")));
m_AdoConn.m_pRecordset->MoveNext();
}
void LevTestView::OnSelchangeYearsel()
{
// TODO: Add your control notification handler code here
yearselcur = m_yearsel.GetCurSel();
m_yearsel.GetLBText(yearselcur, yearsel);
if ( yearsel == "[无限定]")
yearsel = "%";
if (!m_AdoConn.OnInitADOConn())
{
AfxMessageBox("connection failed!");
return ;
}
m_clssel.AddString("[无限制]");
CString cet;
cet.Format("select Classes.Class_No from Classes where Classes.Class_Grade='%s'",yearsel);
m_AdoConn.GetRecordSet((_bstr_t)cet);
while(m_AdoConn.m_pRecordset->adoEOF==0)
{
m_clssel.AddString(_T((char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("Class_No")));
m_AdoConn.m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();
}
1、在组合框中填充内容有两种方法:
1)Comobo Box属性\数据:填入组合框内容,按Ctrl+Enter
2)在MFC ClassWizard中选中组合框ID,再选Messages ->CBN_SELCHANGE添加成员函数
并从数据库中读取要加入组合框中的列值。
如果你选的是第二种方法:
那么初始化第一个组合框内容时,不初始化第二个组合框里内容,并且在第一个组合框的OnSelchange...()函数中直接连接数据库,写sql语句读取第二个组合框内容要以第一个组合框变量为条件,实现两个组合框中内容的级联
举个例子:
目的是实现年级与班级的级联,选2007时,班级组合框中只有2007级班级编号
m_yearsel为第一个组合框变量(意为年级),m_clssel为第二个组合框变量(意为班级)m_yearsel.AddString("[无限定]");
cet.Format("select distinct(Class_Grade) from Classes");
m_AdoConn.GetRecordSet((_bstr_t)cet);
while(m_AdoConn.m_pRecordset->adoEOF==0)
{
m_yearsel.AddString(_T((char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("Class_Grade")));
m_AdoConn.m_pRecordset->MoveNext();
}
void LevTestView::OnSelchangeYearsel()
{
// TODO: Add your control notification handler code here
yearselcur = m_yearsel.GetCurSel();
m_yearsel.GetLBText(yearselcur, yearsel);
if ( yearsel == "[无限定]")
yearsel = "%";
if (!m_AdoConn.OnInitADOConn())
{
AfxMessageBox("connection failed!");
return ;
}
m_clssel.AddString("[无限制]");
CString cet;
cet.Format("select Classes.Class_No from Classes where Classes.Class_Grade='%s'",yearsel);
m_AdoConn.GetRecordSet((_bstr_t)cet);
while(m_AdoConn.m_pRecordset->adoEOF==0)
{
m_clssel.AddString(_T((char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("Class_No")));
m_AdoConn.m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();
}
展开全部
如果ComboBox2只是显示变了,对应操作都相同,就用:
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
const String spNames[3][3] = {
{"1", "2", "3"},
{"甲","乙","丙"},
{"A","B","C"}};
long nIndex = ComboBox1->ItemIndex;
if (nIndex>=3) return;
TStringList * sl = new TStringList;
for (long k=0; k<3; k++)
sl->Add(spNames[nIndex][k]);
ComboBox2->Items = sl;
ComboBox2->ItemIndex = 0;
delete sl;
}
如果响应函数有很大不同,比如 ComboBox2里选1 甲 A 有不同操作,
可以考虑建3个ComboBox,有各自的响应函数。
放在同样位置叠加,用Visible控制,使用者看不出来是3个。
long nIndex = ComboBox1->ItemIndex;
this->ComboBox2->Visible = nIndex==0;
this->ComboBox3->Visible = nIndex==1;
this->ComboBox4->Visible = nIndex==2;
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
const String spNames[3][3] = {
{"1", "2", "3"},
{"甲","乙","丙"},
{"A","B","C"}};
long nIndex = ComboBox1->ItemIndex;
if (nIndex>=3) return;
TStringList * sl = new TStringList;
for (long k=0; k<3; k++)
sl->Add(spNames[nIndex][k]);
ComboBox2->Items = sl;
ComboBox2->ItemIndex = 0;
delete sl;
}
如果响应函数有很大不同,比如 ComboBox2里选1 甲 A 有不同操作,
可以考虑建3个ComboBox,有各自的响应函数。
放在同样位置叠加,用Visible控制,使用者看不出来是3个。
long nIndex = ComboBox1->ItemIndex;
this->ComboBox2->Visible = nIndex==0;
this->ComboBox3->Visible = nIndex==1;
this->ComboBox4->Visible = nIndex==2;
追问
大侠,谢谢你~我是初学者~能否加Q,好好请教下~我的Q 287385274
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
具体方法:
Event Form1.ComboBox1.SelectChange
Call Plugin.Office.OpenXls("c:\1.xls")
form1.combobox2.list=“”
i = 3
For 506
id = Plugin.Office.ReadXls(1, i, 3)
fuid = Plugin.Office.ReadXls(1, i, 2)
name = Plugin.office.readxls(1, i, 1)
If fuid =form1.ComboBox1.ListIndex+1 Then
form1.ComboBox2.list=form1.combobox2.list&"|"&name
End If
i=i+1
Next
Call Plugin.office.closexls("c:\1.xls")
End Event
Event Form1.ComboBox1.SelectChange
Call Plugin.Office.OpenXls("c:\1.xls")
form1.combobox2.list=“”
i = 3
For 506
id = Plugin.Office.ReadXls(1, i, 3)
fuid = Plugin.Office.ReadXls(1, i, 2)
name = Plugin.office.readxls(1, i, 1)
If fuid =form1.ComboBox1.ListIndex+1 Then
form1.ComboBox2.list=form1.combobox2.list&"|"&name
End If
i=i+1
Next
Call Plugin.office.closexls("c:\1.xls")
End Event
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询