求助:MFC中ListCtrl显示数据错乱的问题?

开到荼靡终是梦 2018-07-04 02:28:38
各位大佬好,本人菜鸟,在做一个数据库课程设计。课程设计要求用vc和sql server写出一个图书管理程序。目前已经实现了odbc连接,mfc上也实现了程序,但是列表控件ListCtrl怎么调都调不好。选择用图表显示的话就像下图一样整个都是乱的:

但是,在数据库里面的数据都是这样子的:

我试过把Listctrl调成报告形式,但是那样的话直接什么都显示不出来,整个是空的,不知道为什么。
我想让listctrl里面显示的跟数据库里面的一样,一行行元组挨个显示这样子。

此外,每次我单击查询之后,输入一个数据库内不存在的数据,然后它会提示我“没有查到你要找的图书信息”,但是接下来程序里面所有按钮(查询,修改等等)都用不了了,还会提示“attempt to scroll past end or before beginning of data”,不知道为何,我把查询按钮的代码贴上来,问题可能在代码里面。大神们如果有空也可以帮我看一下可以嘛?
新人积分不多,尽量都交出来了,拜托了!课程设计就在这两天,挺急的。
以下是查询按钮的代码:
void CTSGLView::OnButton2() 
{// TODO: Add your control notification handler code here
Csearch Dlg ;
UpdateData(true);
if(Dlg.DoModal()==IDOK)
{ m_pSet->Edit();
Dlg.m_1.TrimLeft(); // 将字符串最前面的空格修整掉
Dlg.m_2.TrimLeft(); // 将字符串最前面的空格修整掉
Dlg.m_3.TrimLeft(); // 将字符串最前面的空格修整掉
if (Dlg.m_1.IsEmpty()&&Dlg.m_2.IsEmpty()&&Dlg.m_3.IsEmpty())
{MessageBox(" 要查询的条件不能为空! ");
return;
}
if (m_pSet->IsOpen())
m_pSet->Close(); // 如果记录集打开,则先关闭
if(!(Dlg.m_1.IsEmpty())&&!(Dlg.m_2.IsEmpty())&&(Dlg.m_3.IsEmpty()))
{m_pSet->m_strFilter.Format(" 图书编号 ='%s' AND 书名 ='%s' AND 作者名 ='%s' ",Dlg.m_1,Dlg.m_2,Dlg.m_3);
m_pSet->m_strSort = "图书编号 ASC,书名 ASC,作者名 ASC"; }
else
{m_pSet->m_strFilter.Format(" 图书编号 ='%s' OR 书名 ='%s'OR 作者名 ='%s' ",Dlg.m_1,Dlg.m_2,Dlg.m_3);
// m_strFilter 设置对记录的过滤
m_pSet->m_strSort = "图书编号 ASC,书名 ASC,作者名 ASC";
// m_strSort 设置对记录的排序 .按 number 的降序排列记录 }
m_pSet->Open();
// 打开记录集 .Open 函数在构造 SELECT语句时,
// 会把 m_strFilter 和 m_strSort 的内容放入 SELECT语句的 WHERE 和 ORDER BY 子句 中
if (!m_pSet->IsEOF())
{ m_pSet->Requery(); // 如果打开记录集有记录
UpdateData(false);
OnButton1();
OnInitialUpdate();}
else
MessageBox(" 没有查到你要找的图书信息! ");
} }
}
...全文
310 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
老夏 2018-07-05
  • 打赏
  • 举报
回复
需要绑定数据库并对数据进行修改的话,建议直接用数据组件 DataGrid,因为 ListCtrl 要实现编辑的话,还需要额外自定义很多东西,而数据组件已经帮你实现了编辑和数据更新功能。
zgl7903 2018-07-05
  • 打赏
  • 举报
回复
你试一下就知道了,

另外还以一个支持数据库的控件可以参考下 DataGrid
heshaai6843 2018-07-05
  • 打赏
  • 举报
回复
应该把你Listctrl初始化的代码发上来
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
报表模式

DWORD style=C_List.GetExtendedStyle();
m_List.SetExtendedStyle(style|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//以下为插入几个列的列标题
m_List.InsertColumn(1, _T("列1") , LVCFMT_LEFT,40,1);
m_List.InsertColumn(2,_T("列2"),LVCFMT_LEFT,40,2);
m_List.InsertColumn(3,_T("列3"),LVCFMT_LEFT,80,3);
m_List.InsertColumn(4,_T("列4"),LVCFMT_LEFT,80,4);

插入数据时:
m_List.DeleteAllItems();//清空列表框
for(int j=0;j<=nCount;j++)
   {
    m_List.InsertItem(j, _T("c"));//首先插入一行,其中的字符可以任意,也可以为空
    str.Format(_T("%d"),j);
    m_List.SetItemText(j,0,str);//设置第一列数据
    str.Format(_T("%d"),j+1);
    m_List.SetItemText(j,1,str);//设置第二列数据,如此可以设置其它列的数据
   }
谢谢,我有点不太明白,这些数据我数据库里面已经有了,我想问问直接套您的模板就可以了吗
zgl7903 2018-07-04
  • 打赏
  • 举报
回复
报表模式


DWORD style=C_List.GetExtendedStyle();
m_List.SetExtendedStyle(style|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//以下为插入几个列的列标题
m_List.InsertColumn(1, _T("列1") , LVCFMT_LEFT,40,1);
m_List.InsertColumn(2,_T("列2"),LVCFMT_LEFT,40,2);
m_List.InsertColumn(3,_T("列3"),LVCFMT_LEFT,80,3);
m_List.InsertColumn(4,_T("列4"),LVCFMT_LEFT,80,4);

插入数据时:
m_List.DeleteAllItems();//清空列表框
for(int j=0;j<=nCount;j++)
{
m_List.InsertItem(j, _T("c"));//首先插入一行,其中的字符可以任意,也可以为空
str.Format(_T("%d"),j);
m_List.SetItemText(j,0,str);//设置第一列数据
str.Format(_T("%d"),j+1);
m_List.SetItemText(j,1,str);//设置第二列数据,如此可以设置其它列的数据
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧