WTableView 中的 QueryModel:请举例说明如何添加一行并用刚刚创建的新记录填充它

Posted

技术标签:

【中文标题】WTableView 中的 QueryModel:请举例说明如何添加一行并用刚刚创建的新记录填充它【英文标题】:QueryModel in WTableView: Please, an example of how to add a row and fill it with new record just created 【发布时间】:2015-02-10 23:38:16 【问题描述】:

我已经做了一张桌子:

class TableTag

public:
    std::string name;
    //Wt::Dbo::collection< Wt::Dbo::ptr<TablePost> > tablePosts;

    TableTag();
    ~TableTag();
    static void initTableRecords(Wt::Dbo::Session &_session);

    template<class Action>
    void persist(Action &_action)
    
        Wt::Dbo::field(_action, name, "Name");
    
;
typedef Wt::Dbo::collection< Wt::Dbo::ptr<TableTag> > TableTags;

我创建一个模型并将其添加到 WTableView:

qModelTags_ = new Wt::Dbo::QueryModel< Wt::Dbo::ptr<TableTag> >();
qModelTags_->setQuery(ddbbSession_->find<TableTag>());
qModelTags_->addAllFieldsAsColumns();

//WtableView
ctrGridTags_ = new WTableView(this);
ctrGridTags_->setModel(qModelTags_); //qmTags1
ctrGridTags_->setSelectionMode(Wt::SelectionMode::SingleSelection);
root()->addWidget(ctrGridTags_);

这工作正常。现在,我想在表中插入一条记录:

        
        Wt::Dbo::Transaction transaction(*ddbbSession_);

        Wt::Dbo::ptr<TableTag> tag = ddbbSession_->add(new TableTag());
        tag.modify()->name = "Example";            
        

并刷新视图:

        qModelTags_->reload();

这可行,但我觉得如果我有一个包含 100.000 条记录和 100 个字段的表,重新加载所有记录和字段以仅显示一条新记录是不可接受的。我想我应该使用类似的东西:

        int rowNo = qModelTags_->rowCount();
        qModelTags_->insertRow(rowNo);
        qModelTags_->setItemData(...)
        qModelTags_->setData(...) 

但我不知道怎么做。我用谷歌搜索过,我研究过例子,论坛......但我没有找到任何例子!谁能帮我举个简单的例子? 提前谢谢...

【问题讨论】:

【参考方案1】:

Koen Deforche(Wt 框架的创建者)在 Wt 论坛中回复了我,并为我指明了正确的道路(感谢 Koen !!)。我想我应该为大家分享答案,所以我开始:

我推断,给定一个与 WTableView 关联的 QueryModel,有两种方法可以插入记录并刷新表和基础查询:

1.- 直接在数据库中插入记录并重新加载整个 QueryModel:


//Insert one or more records...
Wt::Dbo::Transaction transaction(*ddbbSession_);

Wt::Dbo::ptr<TableTag> tag = ddbbSession_->add(new TableTag());
tag.modify()->name = "Example";            

qModelTags_->reload();

2.- 通过QueryModel间接插入记录,会自动刷新WTableView:

int rowNo = qModelTags_->rowCount();
qModelTags_->insertRow(rowNo);
qModelTags_->setData(rowNo, 1, newTagName.narrow());
ctrGridTags_->select(qModelTags_->index(rowNo, 0));

【讨论】:

以上是关于WTableView 中的 QueryModel:请举例说明如何添加一行并用刚刚创建的新记录填充它的主要内容,如果未能解决你的问题,请参考以下文章

Wt WTableView 默认为分页而不是虚拟滚动

插入 WStandardItemModel 太慢了

Laravel中关系的条件

ASP.NET EF6 查询模型

iOS Xcode 中的 UIViewController 中的 UIView 中的 UITableView

如何用ruby中的数组中的元素替换字符串中的单词?