【第十一章 11.4】列表视图控件Listview -- 简单数据视图

贴主:admin 发贴:2024-08-09 09:18 浏量:10

演示:

代码:

// 导入 win.ui 库,用于创建图形界面
import win.ui;  
/*DSG{{*/
// 创建一个名为 winform 的窗口对象,并设置其属性
var winform = win.form(text="简单数据视图 - 双击编辑单元格(可指定只读列)";right=1031;bottom=712)  
// 向窗口中添加控件
winform.add(
    // 添加一个编辑框控件,并设置其属性
    edit={cls="edit";left=25;top=584;right=997;bottom=693;edge=1;multiline=1;z=2};  
    // 添加一个列表视图控件,并设置其属性
    listview={cls="listview";left=24;top=27;right=996;bottom=555;edge=1;z=1}  
)
/*}}*/

// 导入 win.ui.grid 库,用于处理数据视图
import win.ui.grid;  
// 创建与列表视图关联的数据视图对象
var grid = win.ui.grid(winform.listview);  
// 设置只读列,这里设置第 1 列为只读,设为 -1 则禁止编辑所有列
grid.setReadonlyColumns(1);  
// 可选设置自定义显示的列名
grid.setColumns({"ID";"日期";"标题"})  

// 导入 sqlite 库,用于操作数据库
import sqlite;  
// 创建数据库对象,并连接到指定的数据库文件
var db = sqlite("/testParameters.db");  
// 执行创建表的 SQL 语句,如果表不存在则创建
db.exec( "CREATE TABLE IF NOT EXISTS @tablename(id INTEGER PRIMARY KEY, date, title);",{  
    tablename = "myTableName"  
} )  

// 准备插入数据的 SQL 语句
var cmd = db.prepare("INSERT INTO myTableName VALUES (NULL,@date,@title);" );  
// 使用 for 循环向表中插入数据
for(i=1;10;1){  
    cmd.step(  
        date = time().addday( math.random(1,30));  
        title = string.random(15);  
    )
}

// 从数据库获取查询结果并转换为数据表格式
var dataTable = db.getTable("SELECT * FROM [myTableName] ");  
// 在数据视图中显示数据表
grid.setTable( dataTable )  

// 当编辑单元格的值发生变化时触发此事件
grid.onEditChanged = function(text,iItem,iSubItem){  
    // 获取列名
    var name = dataTable.fields[iSubItem]  
    // 在编辑框中打印相关信息
    winform.edit.print(dataTable[iItem][name],"-->",text);  
    // 更新数据表中的对应值
    dataTable[iItem][name] = text;  
}  

/*
当用户点击列头进行排序时触发此事件
column 为列号,desc 参数指定是否倒序
*/
grid.onSortColumn = function(column,desc){  
    // 获取列名
    var name = dataTable.fields[column];  
    // 对数据表进行排序
    table.sort(dataTable,desc? (lambda(next) owner[name] > next[name]) : (lambda(next) owner[name] < next[name]));  
    // 在数据视图中更新显示排序后的结果
    grid.setTable( dataTable );  
    // 返回 true 允许当前列排序
    return true;  
}

// 显示窗口
winform.show()  
// 启动界面线程消息循环
win.loopMessage();


相关回复


    暂无评论!

发表回复