使用C加载数据库数据到ListView控件 (c listview加载数据库数据库)
在现代软件开发中,数据的管理和展示是软件开发的重要部分之一。数据库是数据管理的重要手段之一,然而,仅仅将数据存储在数据库中是不够的,我们还需要一种便捷的方式来展示数据。ListView控件是一种常用的列表展示控件,将数据加载到ListView控件中,能够方便地将数据展示出来。
本文将介绍如何使用C代码将数据库数据加载到ListView控件中。本文的示例是基于C++代码和SQLite数据库,本文假定读者有一定的C++编程基础和对SQLite数据库的了解。
之一步:创建数据库
我们需要创建一个数据库,并且在其中创建一个表。这个表用来存储我们需要展示的数据。本示例中我们创建了一个名为test.db的数据库,并在其中创建了一个名为test_table的表。这个表有三个字段:id,name和age。以下是创建SQL语句:
“`
CREATE TABLE test_table (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
“`
第二步:插入数据
我们在test_table表中插入几条测试数据,供ListView控件展示。以下是插入数据的SQL语句:
“`
INSERT INTO test_table(name, age) VALUES (‘Jack’, 25);
INSERT INTO test_table(name, age) VALUES (‘Lucy’, 28);
INSERT INTO test_table(name, age) VALUES (‘Tom’, 30);
“`
第三步:使用C++连接数据库
在我们的C++代码中,我们需要使用SQLite提供的头文件和API来连接数据库。以下是连接数据库的代码:
“`
#include
sqlite3* db;
sqlite3_open(“test.db”, &db);
“`
以上代码使用sqlite3_open函数连接数据库。如果连接成功,该函数将返回SQLITE_OK。
第四步:查询数据
我们需要查询test_table表中的数据,并将结果集存储在一个std::vector中。以下是查询数据的代码:
“`
std::vector> data;
sqlite3_stmt* stmt = NULL;
const char* sql = “SELECT id, name, age FROM test_table;”;
int ret = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL);
if (ret != SQLITE_OK) {
sqlite3_close(db);
return -1;
}
while (sqlite3_step(stmt) != SQLITE_DONE) {
int id = sqlite3_column_int(stmt, 0);
const unsigned char* name = sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2);
data.push_back(std::make_tuple(id, std::string((char*)name), age));
}
“`
以上代码使用sqlite3_prepare_v2函数准备SQL语句,sqlite3_step函数执行SQL语句,并使用sqlite3_column_x函数获取查询结果。我们将查询结果存储在std::vector中,这样ListView控件能够方便地将这些数据展示出来。
第五步:设置ListView控件
在我们的C++代码中,我们需要创建ListView控件,并设置其Adapter。本示例中,我们创建了一个自定义的ListViewAdapter,用来将我们的数据渲染到ListView上。以下是设置ListView的代码:
“`
#include
#include
// 每行数据的布局
struct ListViewItemLayout {
int id;
std::string name;
int age;
};
// 自定义的ListViewAdapter
class CustomListViewAdapter {
public:
CustomListViewAdapter(HWND hwndListView, const std::vector& data) :
m_hwndListView(hwndListView), m_data(data) {}
void init() {
// 初始化ListView
ListView_SetExtendedListViewStyleEx(m_hwndListView, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
ListView_InsertColumn(m_hwndListView, 0, “ID”, LVCFMT_LEFT, 80);
ListView_InsertColumn(m_hwndListView, 1, “Name”, LVCFMT_LEFT, 100);
ListView_InsertColumn(m_hwndListView, 2, “Age”, LVCFMT_LEFT, 50);
// 插入数据
for (size_t i = 0; i
auto& item = m_data[i];
LVITEM lvi = { 0 };
lvi.mask = LVIF_TEXT;
lvi.iItem = (int)i;
lvi.pszText = LPSTR_TEXTCALLBACK;
lvi.iSubItem = 0;
ListView_InsertItem(m_hwndListView, &lvi);
ListView_SetItemText(m_hwndListView, i, 0, std::to_string(item.id).c_str());
ListView_SetItemText(m_hwndListView, i, 1, item.name.c_str());
ListView_SetItemText(m_hwndListView, i, 2, std::to_string(item.age).c_str());
}
}
int getCount() const {
return (int)m_data.size();
}
private:
HWND m_hwndListView;
std::vector m_data;
};
// 创建ListView控件的代码
HWND hwndListView = CreateWindow(WC_LISTVIEW, L””,
WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
0, 0, 100, 100,
hwnd, NULL, hInstance, NULL);
// 关联自定义的ListViewAdapter
CustomListViewAdapter adapter(hwndListView, data);
adapter.init();
// 设置ListView控件的宽高
RECT rect;
GetClientRect(hwnd, &rect);
SetWindowPos(hwndListView, NULL, 0, 0, rect.right, rect.bottom, SWP_NOZORDER);
“`
以上代码使用CreateWindow函数创建ListView控件,并关联自定义的ListViewAdapter。我们需要在ListViewAdapter::init函数中初始化ListView,并将数据插入到ListView控件中。
第六步:展示数据
我们需要展示ListView控件,并等待用户交互。以下是展示ListView控件并等待用户交互的代码:
“`
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
“`
以上代码使用ShowWindow函数展示窗口,并使用UpdateWindow函数更新窗口。随后我们使用消息循环等待用户的交互,例如鼠标单击、键盘输入等。
第七步:完整代码实现
现在我们的应用程序已经可以加载数据库数据到ListView控件中了。以下是完整的C++代码实现:
“`
#include
#include
#include
#include
#include
#include
// 数据库文件路径
const char* DATABASE_FILE_NAME = “test.db”;
// 每行数据的布局
struct ListViewItemLayout {
int id;
std::string name;
int age;
};
// 自定义的ListViewAdapter
class CustomListViewAdapter {
public:
CustomListViewAdapter(HWND hwndListView, const std::vector& data) :
m_hwndListView(hwndListView), m_data(data) {}
void init() {
// 初始化ListView
ListView_SetExtendedListViewStyleEx(m_hwndListView, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
ListView_InsertColumn(m_hwndListView, 0, “ID”, LVCFMT_LEFT, 80);
ListView_InsertColumn(m_hwndListView, 1, “Name”, LVCFMT_LEFT, 100);
ListView_InsertColumn(m_hwndListView, 2, “Age”, LVCFMT_LEFT, 50);
// 插入数据
for (size_t i = 0; i
auto& item = m_data[i];
LVITEM lvi = { 0 };
lvi.mask = LVIF_TEXT;
lvi.iItem = (int)i;
lvi.pszText = LPSTR_TEXTCALLBACK;
lvi.iSubItem = 0;
ListView_InsertItem(m_hwndListView, &lvi);
ListView_SetItemText(m_hwndListView, i, 0, std::to_string(item.id).c_str());
ListView_SetItemText(m_hwndListView, i, 1, item.name.c_str());
ListView_SetItemText(m_hwndListView, i, 2, std::to_string(item.age).c_str());
}
}
int getCount() const {
return (int)m_data.size();
}
private:
HWND m_hwndListView;
std::vector m_data;
};
// 获取数据的代码
std::vector fetchData() {
std::vector> data;
// 打开数据库文件
sqlite3* db;
sqlite3_open(DATABASE_FILE_NAME, &db);
// 查询数据
sqlite3_stmt* stmt = NULL;
const char* sql = “SELECT id, name, age FROM test_table;”;
int ret = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL);
if (ret != SQLITE_OK) {
sqlite3_close(db);
return std::vector();
}
while (sqlite3_step(stmt) != SQLITE_DONE) {
int id = sqlite3_column_int(stmt, 0);
const unsigned char* name = sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2);
data.push_back(std::make_tuple(id, std::string((char*)name), age));
}
sqlite3_finalize(stmt);
sqlite3_close(db);
// 转换成ListView项的布局
std::vector result;
for (auto& item : data) {
int id = std::get(item);
std::string name = std::get(item);
int age = std::get(item);
result.push_back(ListViewItemLayout{ id, name, age });
}
return result;
}
// 窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE: {
// 创建ListView控件
HWND hwndListView = CreateWindow(WC_LISTVIEW, L””,
WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
0, 0, 100, 100,
hwnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
// 获取数据
std::vector data = fetchData();
// 关联自定义的ListViewAdapter
CustomListViewAdapter adapter(hwndListView, data);
adapter.init();
// 设置ListView控件的宽高
RECT rect;
GetClientRect(hwnd, &rect);
SetWindowPos(hwndListView, NULL, 0, 0, rect.right, rect.bottom, SWP_NOZORDER);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMn(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 注册窗口类
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = L”ListViewSample”;
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindow(L”ListViewSample”, L”ListView Sample”,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if (hwnd == NULL) {
return 0;
}
// 展示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// 消息循环
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
“`
第八步: