问题:

1.这样的列表,我想设两个下拉框,一个下拉框显示车间信息,另一个显示相应点位信息,并可选择。如何实现
2.这个表格在触摸屏上可编辑
解决示例:
1.界面如下,左侧为数据增删改,右侧为两个下拉框

2.代码说明
2.1 【创建车间点位数据表】
创建数据表只需执行一次,或者用第三方sqlite工具手动创建
void Frm01::wMButton1_clk_cb(uint16_t code, LvEvent e) {
/*wMButton1(创建车间点位数据表)的点击事件*/
//创建表格的sql语句
string sql = "CREATE TABLE WorkShopPosition (WorkShop TEXT NOT NULL, Position TEXT NOT NULL, UNIQUE(WorkShop, Position));";
if(DBMgr::getdb()->execute(sql) == 0) {
cout<<"失败"<<endl;
}
}
2.2 【添加】
void Frm01::wMButton2_clk_cb(uint16_t code, LvEvent e) {
/*wMButton2(添加)的点击事件*/
//获取输入框的内容
string str1 = wMText1->getText();
string str2 = wMText2->getText();
//1.要判断str1,str2的有效性
//略
//2.添加的sql语句
string sql = StringUtil::snprintf("INSERT OR IGNORE INTO WorkShopPosition (WorkShop, Position) VALUES ('%s', '%s');", str1.c_str(), str2.c_str());
if(DBMgr::getdb()->execute(sql) == 0) {
cout<<"失败"<<endl;
} else {
tv_wMSqliteTable1->navFirst();//刷新
}
}
2.3 【删除】
void Frm01::wMButton3_clk_cb(uint16_t code, LvEvent e) {
/*wMButton3(删除)的点击事件*/
//获取表格中选中项内容
int row = wMSqliteTable1->getSelectedRow();
if(row<0)return;
vector<string> vs = tv_wMSqliteTable1->getRow(row);
//删除的sql语句
string sql = StringUtil::snprintf("DELETE FROM WorkShopPosition WHERE WorkShop='%s' AND Position='%s'", vs[0].c_str(),vs[1].c_str());
if(DBMgr::getdb()->execute(sql) == 0) {
cout<<"失败"<<endl;
} else {
tv_wMSqliteTable1->navFirst();//刷新
}
}
2.4 【修改】
void Frm01::wMButton4_clk_cb(uint16_t code, LvEvent e) {
/*wMButton4(修改)的点击事件*/
//获取表格中选中项内容
int row = wMSqliteTable1->getSelectedRow();
if(row<0)return;
vector<string> vs = tv_wMSqliteTable1->getRow(row);
//获取输入框的内容
string str1 = wMText1->getText();
string str2 = wMText2->getText();
//修改的sql语句
string sql = StringUtil::snprintf("UPDATE WorkShopPosition SET WorkShop='%s', Position='%s' WHERE WorkShop='%s' AND Position='%s'"
,str1.c_str(), str2.c_str(), vs[0].c_str(), vs[1].c_str());
if(DBMgr::getdb()->execute(sql) == 0) {
cout<<"失败"<<endl;
} else {
tv_wMSqliteTable1->navFirst();//刷新
}
}
2.5 【刷新上表】(可选)
void Frm01::wMButton5_clk_cb(uint16_t code, LvEvent e) {
/*wMButton5(刷新上表)的点击事件*/
tv_wMSqliteTable1->navFirst();//刷新
}
2.6 【刷新车间下拉框】
一般左边的数据维护和右边的数据应用不会放在同一个页面,此处方便演示放在同一页。放在不同页时,下面代码放在下拉框所在页的onLoad方法里就可以了
void Frm01::wMButton6_clk_cb(uint16_t code, LvEvent e) {
/*wMButton6(刷新下拉框)的点击事件*/
wMDropdown1->clearOptions();
string sql = "SELECT DISTINCT WorkShop FROM WorkShopPosition";
TTable tt = DBMgr::getdb()->query(sql);
for(int i=0;i<tt.getRecordCnt();i++) {
wMDropdown1->addOption(tt.getValue(i, 0), tt.getValue(i, 0));
}
}
2.7 【刷新点位下拉框】
void Frm01::wMDropdown1_vch_cb(uint16_t code, LvEvent e) {
//车间的值变化,刷新点位下拉框
wMDropdown2->clearOptions();
string sql = StringUtil::snprintf("SELECT DISTINCT Position FROM WorkShopPosition WHERE WorkShop='%s'", wMDropdown1->getSelectedText().c_str());
TTable tt = DBMgr::getdb()->query(sql);
for(int i=0;i<tt.getRecordCnt();i++) {
wMDropdown2->addOption(tt.getValue(i, 0), tt.getValue(i, 0));
}
}
3. 【获取下拉框选的文字】
wMDropdown1->getSelectedText()