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

时间:2015-02-10 23:38:16

标签: c++ wt

我做了一张桌子:

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

但我无法弄清楚如何。我用Google搜索过,我已经查看了示例,论坛......但我找不到任何示例!有人能帮我一个简单的例子吗? 提前谢谢......

1 个答案:

答案 0 :(得分:0)

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