菜单

数据维护及两个下拉框联动

下载

问题:

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()

 

源码testSqlite.zip

上一个
第十一章 数据库功能
下一个
程序下载到屏幕上只运行某个函数一次的办法,重新上电也不会再次运行该函数
最近修改: 2026-02-20Powered by