在现代软件开发中,数据的管理和展示是软件开发的重要部分之一。数据库是数据管理的重要手段之一,然而,仅仅将数据存储在数据库中是不够的,我们还需要一种便捷的方式来展示数据。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;
}
“`
第八步:
相关问题拓展阅读:
以一个验证登陆为例子
这里是界面层一般叫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;
}
}
自己重写adapter 写个setlist的方法,获取所有数据后直接setlist
关于c listview加载数据库数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
成都创新互联科技有限公司,是一家专注于互联网、IDC服务、应用软件开发、网站建设推广的公司,为客户提供互联网基础服务!
创新互联(www.cdcxhl.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。创新互联——四川成都IDC机房服务器托管/机柜租用。为您精选优质idc数据中心机房租用、服务器托管、机柜租赁、大带宽租用,高电服务器托管,算力服务器租用,可选线路电信、移动、联通机房等。
分享文章:使用C加载数据库数据到ListView控件(clistview加载数据库数据库)
转载注明:http://www.shufengxianlan.com/qtweb/news12/451612.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联