使用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;

}

“`

第八步:


数据运维技术 » 使用C加载数据库数据到ListView控件 (c listview加载数据库数据库)