使用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中??
  • 怎么将listview 里面显示的内容新增到数据库

C#中用三层架构来完成将数据库里面的数据显示到listView中??

以一个验证登陆为例子

这里是界面层一般叫UIL

protected void Button1_Click(object sender, EventArgs e)

{

List Users = BAL.GetUserInfo(txtUserName.Text,txtPassword.Text);

if(Users.Length > 0)

{

Response.Write(“登陆成功”);

}

else

{

Response.Write(“登陆失败举芦”);

}

}

以下是逻辑层代码,业务逻辑层一般叫BLL

public static List GetUserInfo(string user,string password)

{

string newPassword = GetMD5Hash(password); //这里对密码进行加密处理,数据库中存放的是经过MD5加密后的密,业务逻辑层一般都是处理复杂的逻辑.例如加密逻绝答镇辑

List Users = DAL.GetUserInfo(user,newPassword);

return Users;

}

以下是数据访问层代码,数据访问层一般叫DAL

public static List GetUserInfo(string user,string password)

{

List Users = new List();

string sql = “select * from User where Password = ‘”+password+”‘ and User = ‘”+user+”‘”; //写where子句的时候把Password放前面.因为Password经过加密,所以可以防止SQL注入攻击

SqlDataAdapter da = new SqlDataAdapter(sql,”这里是数据库连接字符串”);

DataSet ds = new DataSet();

da.Fill(ds);

for(int i=0;i.Rows.Count;i++)

{

User user = new User(ds.Tables.Rows.ToString(),ds.Tables.Rows.ToString(),ds.Tables.Rows.ToString());

Users.Add(user);

}

return Users;

}

还会有一个Model层.叫做模板层.是数据表结构的印射.Model层是共用层,其他三层都要用到.

比如数据库中有张表User,里面有3个字段ID,User,Password

那么在模板层中应该有一个类,数据库中User表的一行对应一个User对象,一张表对应User对象的.

public class User

{

string ID;

string User;

string Password;

//并粗重载构造函数

User(string id,string user,string password)

{

this.ID=id;

this.User=user;

this.Password=password;

}

}

怎么将listview 里面显示的内容新增到数据库

自己重写adapter 写个setlist的方法,获取所有数据后直接setlist

关于c listview加载数据库数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/285242.html<

(0)
运维的头像运维
上一篇2025-05-14 19:21
下一篇 2025-05-14 19:22

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注