对于表格设计我们提供了TTable.h
,对于表格的视图设计我们提供了TTableView.h
供用户调用,下面将详细讲解这两个头文件中的部分重点接口。首先,在添加完表格并进行表格设计
后,生成的代码大致如下图所示:
由图所示,图中的wMSqliteTable1
的指针对应的为表格设计,取用的接口为TTable.h
中的接口。在进行了表格设计后,会生成一个tv_wMSqliteTable1
的指针对应表格视图设计,取用的接口为TTableView.h
中的接口。
注意
TTable 中的接口大多对应表格的样式,对于每行/每列或是整个表格的数据处理,例如:获取选中的行列值。对于 TTableView 中的接口大多都是对数据源的的操作,如跳转上一页/下一页。
该表格适用于所有带表格的控件,如下图所示:
/**
* @LEVEL0
* @brief 添加列并赋初值
* @param col 列的id
* @param value 增加行时该列的默认值
*/
virtual void addColumn(const string& col, const string& value="");
/**
* @LEVEL0
* @brief 设置列并赋初值
* @param colindex 序号
* @param colname 列名
* @param defvalue 初值
*/
virtual void setColumn(int colindex, const string& colname, const string& defvalue="");
/**
* @LEVEL0
* @brief 检查列名是否存在并返回列的序号
* @param column_name
* @return 列的序号 >=0:OK <0:不包含
*/
virtual int hasColumn(const string& columnName) const;
/**
* @LEVEL0
* @brief 获取列名
* @param col 列索引号
* @return 不存在, 返回空
*/
virtual string getColumnName(int col);
/**
* @LEVEL0
* @brief 返回列名
* @return
*/
virtual vector<string> getColumnNames();
/**
* @LEVEL0
* @brief 获取指定列中值列表
* @param col 指定列的id
* @param values 存储该列所有行的值
* @return 不存在指定列,返回false. 否则返回true
*/
virtual bool getColumnValues(const string& col, vector<string>& values);
/**
* @LEVEL0
* @brief 获取列数
*/
virtual int getColumnCount();
/**
* @LEVEL0
* @brief 删除指定列
* @param col 列名
* @return 不存在指定列,返回false. 否则返回true
*/
virtual bool delColumn(const string& col);
/**
* @LEVEL0
* @brief 删除所有列
* @return
*/
bool delColumnAll();
/**
* @LEVEL0
* @brief 在尾部简单新增行
* @param str 字符串
* @param split 分隔符
*/
virtual void addRow(const string& str="", const string& split=",");
/**
* @LEVEL0
* @brief 在尾部简单新增行
* @param row 值列表
*/
virtual void addRow(vector<string>& row);
/**
* @LEVEL0
* @brief 在尾部新增行
* 新增时比较列ID与新增行参数中键值
* @param row 值列表
*/
virtual void addRow(vector<KV_Str_Str>& row);
/**
* @LEVEL0
* @brief 在指定位置简单新增行
* @param pos 插入位置的索引
* @param row 值列表
*/
virtual bool insertRow(int pos, vector<string>& row);
/**
* @LEVEL0
* @brief 在指定位置新增行
* 新增时比较列ID与新增行参数中键值
* @param pos 插入位置的索引
* @param row 值列表
*/
virtual bool insertRow(int pos, vector<KV_Str_Str>& row);
/**
* @LEVEL0
* @brief 删除指定行
* @param rowIndex 行索引
* 如果指定行<0的数,则删除全部
* @return
*/
virtual bool delRow(int rowIndex);
/**
* @LEVEL0
* @brief 删除所有行
*/
virtual void delAllRow();
/**
* @LEVEL0
* @brief 返回指定行数据
* @param rowIndex 行号 0...n
* @return
*/
virtual vector<string> getRow(int rowIndex);
/**
* @LEVEL0
* @brief 获取指定行列值
* @param rowIndex 行号:0...n
* @param colName 列名
* @param res 返回值
* @return
*/
virtual string getValue(int rowIndex, const string& colName);
/**
* @LEVEL0
* @brief 获取指定行指定列值
* @param rowIndex 行号:0...n
* @param colIndex 列号:0...n
* @param res 返回值
* @return
*/
virtual string getValue(int rowIndex, int colIndex);
/**
* @LEVEL0
* @brief 设置指定行指定列的值
* @param rowIndex 行号:0...n
* @param colIndex 列号:0...n
* @param value 设置值
* @return
*/
virtual bool setValue(int rowIndex, int colIndex, const string& value);
/**
* @LEVEL0
* @brief 从其它TTable拷贝数据进来
* @param other
*/
virtual void copy(TTable& other);
/**
* @LEVEL0
* @brief 从其它表将数据合并(复制)进来
* @param other 其它表,列数要与本表一致
*/
bool merge(TTable& other);
/**
* @LEVEL0
* @brief 设置选择项序号
* @param sel
*/
virtual void setSelectedIndex(int sel, SttObject* obj=nullptr);
/**
* @LEVEL0
* @brief 返回选中项序号
* @return
*/
virtual int getSelectedIndex();
/**
* @LEVEL0
* @brief 获取键值列、显示值列序号
* @param k 返回键值列序号
* @param l 返回显示列序号
*/
virtual void getKeyLabelIndex(int& k, int& l);
/**
* @HideCA 数据的行数
*/
int size();
/**
* @brief 获取总记录数
* @return
*/
virtual int getRecordCnt();
/**
* @brief (关联变量)总记录数
* @param v
*/
void bindRecordCnt(Ivariable v);
/**
* @brief 通知刷新
*/
void notify();
/**@brief 关键字段(列名)*/
string m_key;
/**@brief 显示字段(列名)*/
string m_label;
/**@brief 列集合 K:列名 V:默认值*/
vector<Column> m_columns;
/**@brief 行集合*/
vector<Row> m_rows;
/**@brief status*/
uint8_t mStatus;
/**@brief 选中行索引*/
int selectedIndex;
/**@brief 总记录数(关联变量)*/
Ivariable v_record_cnt;
以上面的wMSqliteTable1
指针为例
// 获取第0列的名称
string colName = wMSqliteTable1->getColumnName(0);
// 获取所有的行集合
vector<Row> rows = wMSqliteTable1->m_rows;
TTableViews 是 TTable 的子类。
/**
* @brief 获取当前分页序号
* @return
*/
int getPageIndex();
/**
* @brief 获取总分页数
* @return
*/
int getPageCnt();
/**
* @brief 设置分页大小
* @param size
*/
void setPageSize(int size);
/**
* @brief 获取每页记录数
* @return
*/
int getPageSize();
/**
* @brief 获取总记录数
* @return
*/
int getRecordCnt();
/**
* @brief 跳转第一页
* @return
*/
void navFirst();
/**
* @brief 跳转下一页
*/
void navNext();
/**
* @brief 跳转上一页
*/
void navBack();
/**
* @brief 跳转最后一页
*/
void navLast();
/**
* @brief (关联变量)分页记录数
* @param v
*/
void bindPageSize(Ivariable v);
/**
* @brief (关联变量)当前页序号
* @param v
*/
void bindPageIndex(Ivariable v);
/**
* @brief (关联变量)总页数
* @param v
*/
void bindPageCnt(Ivariable v);
/**
* @brief 获取数据:从数据库中查询数据,并根据notify是否刷新控件
* @param notifiy 是否通知控件刷新
*/
void drawData(bool notifiy);
/**
* @HideCA 基类已显示
* @brief 取变量类型
*/
uint8_t type();
/**
* @LEVEL1
* @brief 重新定义数据源,用于条件查询时改变查询语句
* @param tbl 表名
* @param cond where条件部分(不要含WHERE这个词),注意默认值是字符串"NULL",不是指针NULL。为"NULL"时,保持原条件不变
*/
void refine(const string& tbl, const string& cond="NULL");
/**
* @brief 是否启用倒序
*/
void enDesc(bool b);
/**
* @brief 重设数据库连接。由于U盘热插拔后,盘符变化,在U盘上的db路径就变化了
*/
void resetDB(IDatabase * db);
/**
* @HideCA
* @brief 获取绑定数据的sql语句
* @param bpage 是否增加offset x limit x语句
*/
string combineSql(bool bpage);
/**
* @HideCA
* @brief 页面大小变化响应
* @param org
* @param data
*/
void onPageSizeChanged(SttObject * org, IVariable* data);
/**
* @HideCA
* @brief 当前页变化响应
* @param org
* @param data
*/
void onPageIndexChanged(SttObject * org, IVariable* data);
IDatabase *m_db; //数据源
string m_tbl; //表名称
string m_fields; //表字段 空或XXX,XXXX,XXX
string m_cond; //查询条件(不含WHERE)
bool m_isDesc; //是否倒序
int m_pg_ix; //当前页序号
int m_pg_size; //页记录大小
int m_pg_cnt; //总页数
int m_record_cnt; //总记录数
Ivariable v_page_size; //(关联变量)分页记录数
Ivariable v_page_ix; //(关联变量)当前页序号
Ivariable v_page_cnt; //(关联变量)总页数
以上面的tv_wMSqliteTable1
指针为例
// 刷新数据源
string colName = tv_wMSqliteTable1->drawData(true);
// 获取表名称
string tblName = tv_wMSqliteTable1->m_tbl;