新聞中心
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)的管理和展示是軟件開發(fā)的重要部分之一。數(shù)據(jù)庫(kù)是數(shù)據(jù)管理的重要手段之一,然而,僅僅將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中是不夠的,我們還需要一種便捷的方式來展示數(shù)據(jù)。ListView控件是一種常用的列表展示控件,將數(shù)據(jù)加載到ListView控件中,能夠方便地將數(shù)據(jù)展示出來。

本文將介紹如何使用C代碼將數(shù)據(jù)庫(kù)數(shù)據(jù)加載到ListView控件中。本文的示例是基于C++代碼和SQLite數(shù)據(jù)庫(kù),本文假定讀者有一定的C++編程基礎(chǔ)和對(duì)SQLite數(shù)據(jù)庫(kù)的了解。
之一步:創(chuàng)建數(shù)據(jù)庫(kù)
我們需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù),并且在其中創(chuàng)建一個(gè)表。這個(gè)表用來存儲(chǔ)我們需要展示的數(shù)據(jù)。本示例中我們創(chuàng)建了一個(gè)名為test.db的數(shù)據(jù)庫(kù),并在其中創(chuàng)建了一個(gè)名為test_table的表。這個(gè)表有三個(gè)字段:id,name和age。以下是創(chuàng)建SQL語(yǔ)句:
“`
CREATE TABLE test_table (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
“`
第二步:插入數(shù)據(jù)
我們?cè)趖est_table表中插入幾條測(cè)試數(shù)據(jù),供ListView控件展示。以下是插入數(shù)據(jù)的SQL語(yǔ)句:
“`
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++連接數(shù)據(jù)庫(kù)
在我們的C++代碼中,我們需要使用SQLite提供的頭文件和API來連接數(shù)據(jù)庫(kù)。以下是連接數(shù)據(jù)庫(kù)的代碼:
“`
#include
sqlite3* db;
sqlite3_open(“test.db”, &db);
“`
以上代碼使用sqlite3_open函數(shù)連接數(shù)據(jù)庫(kù)。如果連接成功,該函數(shù)將返回SQLITE_OK。
第四步:查詢數(shù)據(jù)
我們需要查詢test_table表中的數(shù)據(jù),并將結(jié)果集存儲(chǔ)在一個(gè)std::vector中。以下是查詢數(shù)據(jù)的代碼:
“`
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函數(shù)準(zhǔn)備SQL語(yǔ)句,sqlite3_step函數(shù)執(zhí)行SQL語(yǔ)句,并使用sqlite3_column_x函數(shù)獲取查詢結(jié)果。我們將查詢結(jié)果存儲(chǔ)在std::vector中,這樣ListView控件能夠方便地將這些數(shù)據(jù)展示出來。
第五步:設(shè)置ListView控件
在我們的C++代碼中,我們需要?jiǎng)?chuàng)建ListView控件,并設(shè)置其Adapter。本示例中,我們創(chuàng)建了一個(gè)自定義的ListViewAdapter,用來將我們的數(shù)據(jù)渲染到ListView上。以下是設(shè)置ListView的代碼:
“`
#include
#include
// 每行數(shù)據(jù)的布局
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);
// 插入數(shù)據(jù)
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;
};
// 創(chuàng)建ListView控件的代碼
HWND hwndListView = CreateWindow(WC_LISTVIEW, L””,
WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
0, 0, 100, 100,
hwnd, NULL, hInstance, NULL);
// 關(guān)聯(lián)自定義的ListViewAdapter
CustomListViewAdapter adapter(hwndListView, data);
adapter.init();
// 設(shè)置ListView控件的寬高
RECT rect;
GetClientRect(hwnd, &rect);
SetWindowPos(hwndListView, NULL, 0, 0, rect.right, rect.bottom, SWP_NOZORDER);
“`
以上代碼使用CreateWindow函數(shù)創(chuàng)建ListView控件,并關(guān)聯(lián)自定義的ListViewAdapter。我們需要在ListViewAdapter::init函數(shù)中初始化ListView,并將數(shù)據(jù)插入到ListView控件中。
第六步:展示數(shù)據(jù)
我們需要展示ListView控件,并等待用戶交互。以下是展示ListView控件并等待用戶交互的代碼:
“`
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
“`
以上代碼使用ShowWindow函數(shù)展示窗口,并使用UpdateWindow函數(shù)更新窗口。隨后我們使用消息循環(huán)等待用戶的交互,例如鼠標(biāo)單擊、鍵盤輸入等。
第七步:完整代碼實(shí)現(xiàn)
現(xiàn)在我們的應(yīng)用程序已經(jīng)可以加載數(shù)據(jù)庫(kù)數(shù)據(jù)到ListView控件中了。以下是完整的C++代碼實(shí)現(xiàn):
“`
#include
#include
#include
#include
#include
#include
// 數(shù)據(jù)庫(kù)文件路徑
const char* DATABASE_FILE_NAME = “test.db”;
// 每行數(shù)據(jù)的布局
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);
// 插入數(shù)據(jù)
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;
};
// 獲取數(shù)據(jù)的代碼
std::vector fetchData() {
std::vector> data;
// 打開數(shù)據(jù)庫(kù)文件
sqlite3* db;
sqlite3_open(DATABASE_FILE_NAME, &db);
// 查詢數(shù)據(jù)
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);
// 轉(zhuǎn)換成ListView項(xiàng)的布局
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: {
// 創(chuàng)建ListView控件
HWND hwndListView = CreateWindow(WC_LISTVIEW, L””,
WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
0, 0, 100, 100,
hwnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
// 獲取數(shù)據(jù)
std::vector data = fetchData();
// 關(guān)聯(lián)自定義的ListViewAdapter
CustomListViewAdapter adapter(hwndListView, data);
adapter.init();
// 設(shè)置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) {
// 注冊(cè)窗口類
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = L”ListViewSample”;
RegisterClass(&wc);
// 創(chuàng)建窗口
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);
// 消息循環(huán)
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
“`
第八步:
相關(guān)問題拓展閱讀:
- C#中用三層架構(gòu)來完成將數(shù)據(jù)庫(kù)里面的數(shù)據(jù)顯示到listView中??
- 怎么將listview 里面顯示的內(nèi)容新增到數(shù)據(jù)庫(kù)
C#中用三層架構(gòu)來完成將數(shù)據(jù)庫(kù)里面的數(shù)據(jù)顯示到listView中??
以一個(gè)驗(yàn)證登陸為例子
這里是界面層一般叫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(“登陸失敗舉蘆”);
}
}
以下是邏輯層代碼,業(yè)務(wù)邏輯層一般叫BLL
public static List GetUserInfo(string user,string password)
{
string newPassword = GetMD5Hash(password); //這里對(duì)密碼進(jìn)行加密處理,數(shù)據(jù)庫(kù)中存放的是經(jīng)過MD5加密后的密,業(yè)務(wù)邏輯層一般都是處理復(fù)雜的邏輯.例如加密邏絕答鎮(zhèn)輯
List Users = DAL.GetUserInfo(user,newPassword);
return Users;
}
以下是數(shù)據(jù)訪問層代碼,數(shù)據(jù)訪問層一般叫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子句的時(shí)候把Password放前面.因?yàn)镻assword經(jīng)過加密,所以可以防止SQL注入攻擊
SqlDataAdapter da = new SqlDataAdapter(sql,”這里是數(shù)據(jù)庫(kù)連接字符串”);
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;
}
還會(huì)有一個(gè)Model層.叫做模板層.是數(shù)據(jù)表結(jié)構(gòu)的印射.Model層是共用層,其他三層都要用到.
比如數(shù)據(jù)庫(kù)中有張表User,里面有3個(gè)字段ID,User,Password
那么在模板層中應(yīng)該有一個(gè)類,數(shù)據(jù)庫(kù)中User表的一行對(duì)應(yīng)一個(gè)User對(duì)象,一張表對(duì)應(yīng)User對(duì)象的.
public class User
{
string ID;
string User;
string Password;
//并粗重載構(gòu)造函數(shù)
User(string id,string user,string password)
{
this.ID=id;
this.User=user;
this.Password=password;
}
}
怎么將listview 里面顯示的內(nèi)容新增到數(shù)據(jù)庫(kù)
自己重寫adapter 寫個(gè)setlist的方法,獲取所有數(shù)據(jù)后直接setlist
關(guān)于c listview加載數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
網(wǎng)站標(biāo)題:使用C加載數(shù)據(jù)庫(kù)數(shù)據(jù)到ListView控件(clistview加載數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù))
轉(zhuǎn)載來源:http://fisionsoft.com.cn/article/cdddocj.html


咨詢
建站咨詢
