WTableView 中的 QueryModel:请举例说明如何添加行并用刚创建的新记录填充它
QueryModel in WTableView: Please, an example of how to add a row and fill it with new record just created
我做了一个table:
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_);
这没问题。现在,我想在 table:
中插入一条记录
{
Wt::Dbo::Transaction transaction(*ddbbSession_);
Wt::Dbo::ptr<TableTag> tag = ddbbSession_->add(new TableTag());
tag.modify()->name = "Example";
}
并刷新视图:
qModelTags_->reload();
这行得通,但我觉得如果我有一个包含 100.000 条记录和 100 个字段的 table,则无法接受 table 重新加载所有记录和字段以仅显示一个新记录记录。我想我应该使用类似的东西:
int rowNo = qModelTags_->rowCount();
qModelTags_->insertRow(rowNo);
qModelTags_->setItemData(...)
qModelTags_->setData(...)
但我想不通怎么办。我在谷歌上搜索过,我查看过例子、论坛……但我没有找到例子!谁能帮我举个简单的例子?
提前致谢...
Koen Deforche(Wt 框架的创建者)在 Wt 论坛中回复了我,并为我指明了正确的道路(感谢 Koen!!)。我想我应该把答案分享给大家,所以我开始了:
我推断,给定一个与 WTableView 关联的 QueryModel,有两种方法可以插入记录并刷新 table 和基础查询:
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));
我做了一个table:
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_);
这没问题。现在,我想在 table:
中插入一条记录 {
Wt::Dbo::Transaction transaction(*ddbbSession_);
Wt::Dbo::ptr<TableTag> tag = ddbbSession_->add(new TableTag());
tag.modify()->name = "Example";
}
并刷新视图:
qModelTags_->reload();
这行得通,但我觉得如果我有一个包含 100.000 条记录和 100 个字段的 table,则无法接受 table 重新加载所有记录和字段以仅显示一个新记录记录。我想我应该使用类似的东西:
int rowNo = qModelTags_->rowCount();
qModelTags_->insertRow(rowNo);
qModelTags_->setItemData(...)
qModelTags_->setData(...)
但我想不通怎么办。我在谷歌上搜索过,我查看过例子、论坛……但我没有找到例子!谁能帮我举个简单的例子? 提前致谢...
Koen Deforche(Wt 框架的创建者)在 Wt 论坛中回复了我,并为我指明了正确的道路(感谢 Koen!!)。我想我应该把答案分享给大家,所以我开始了:
我推断,给定一个与 WTableView 关联的 QueryModel,有两种方法可以插入记录并刷新 table 和基础查询:
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));