我正在尝试使用 MFC 在列表控件上显示 SQL 结果

Posted

技术标签:

【中文标题】我正在尝试使用 MFC 在列表控件上显示 SQL 结果【英文标题】:I am trying to display SQL result on a list control using MFC 【发布时间】:2021-03-26 19:20:06 【问题描述】:

拜托,我打开了列表控件,我想在列表控件上显示我的查询结果。程序运行无误,但列表控件没有显示SQL结果。

BOOL CClassDialog::OnInitDialog()

    CDialogEx::OnInitDialog();

    // TODO:  Add extra initialization here
    CString DSN;
    DSN = _T("DRIVER=SQL Server;SERVER=DESKTOP-
DICUCDS\\SQL2K14;Trusted_Connection=Yes;APP=Microsoft\x00ae Visual Studio\x00ae 2013;WSID=DESKTOP-
DICUCDS;DATABASE=School");

    CDatabase aDB; 
    try 
        aDB.OpenEx(DSN);  

        CRecordset aRS(&aDB); 
        aRS.Open(CRecordset::forwardOnly, (L"SELECT DISTINCT Myclass FROM MyFacts"));  

        // populate Grids
        ListView_SetExtendedListViewStyle(m_classlist, LVS_EX_GRIDLINES);

        // Column width and heading
        m_classlist.InsertColumn(1, L"Class", LVCFMT_LEFT, -1, 1);

        m_classlist.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
        m_classlist.SetColumnWidth(0, 120);
        m_classlist.SetColumnWidth(1, 200);
        m_classlist.SetColumnWidth(2, 200);

        while(!aRS.IsEOF())   
        
            CString strValue;
            aRS.GetFieldValue(L"Myclass",  strValue);
            m_classlist.SetItemText(-1, 1, strValue);
            //strValue.AddString(strValue);

            aRS.MoveNext();
        
        aRS.Close();
        aDB.Close();
    
    catch (CDBException * ex)
    
        TCHAR buf[255];

        ex->GetErrorMessage(buf, 255);

        CString strPrompt(buf);
        AfxMessageBox(strPrompt);
    

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE


void CClassDialog::ResetListControl()

    m_classlist.DeleteAllItems();
    int iNbrOfColumns;

    CHeaderCtrl* pHeader = (CHeaderCtrl*)m_classlist.GetDlgItem(0);

    if (pHeader) 
        iNbrOfColumns = pHeader->GetItemCount();
    

    for (int i = iNbrOfColumns; i >= 0; i--) 
        m_classlist.DeleteColumn(i);
    

【问题讨论】:

您是否尝试过先调试代码。例如,你能保证它实际上是在打开数据库吗?你真的确认它正在返回一个记录集吗?您是否尝试过简单地将结果添加到更简单的控件(如列表框)中?目前您刚刚向我们展示了一个 OnInitDialog 方法,如果您不提供一些上下文和调试结果,我们不知道问题出在哪里。希望以上内容有所帮助。 【参考方案1】:

你确定这是对的吗? m_classlist.SetItemText(-1, 1, strValue);

如果您研究CListCtrl(例如here)的官方文档,您会看到:

CString strText;

int nColumnCount = m_myListCtrl.GetHeaderCtrl()->GetItemCount();

// Insert 10 items in the list view control.
for (int i = 0; i < 10; i++)

    strText.Format(TEXT("item %d"), i);

    // Insert the item, select every other item.
    m_myListCtrl.InsertItem(LVIF_TEXT | LVIF_STATE, i, strText,
        (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);

    // Initialize the text of the subitems.
    for (int j = 1; j < nColumnCount; j++)
    
        strText.Format(TEXT("sub-item %d %d"), i, j);
        m_myListCtrl.SetItemText(i, j, strText);
    

您正在引用SetItemText,但实际上并未将任何元素添加到列表中。前面的代码是一个例子:

// Insert the item, select every other item.
m_myListCtrl.InsertItem(LVIF_TEXT | LVIF_STATE, i, strText,
    (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);

我并不是说您必须使用那组特定的参数。但关键是您必须先将一个项目插入到列表中,然后才能更新它的属性。甚至在您将其添加到列表时设置属性。

【讨论】:

非常感谢安德鲁。有效。请问,如果我想使用替代方法,例如 m_mylistctrl.Addstring 和 m_mylistctrl.Insertstring。他们适合在哪里? @aloemconsultaloemconsult 最好为其他问题做新问题。另外,当您对它感到满意时,不要忘记投票/接受答案。 我没有看到为 CListCtrl 列出的那些方法:docs.microsoft.com/en-us/cpp/mfc/reference/…

以上是关于我正在尝试使用 MFC 在列表控件上显示 SQL 结果的主要内容,如果未能解决你的问题,请参考以下文章

列表控件中的 MFC 对话框组合框

MFC 在控件上显示图片不起作用

限制列表控件 MFC 中的条目数

怎样将数据库中数据表显示在MFC中的列表控件上,并对其进行删除,修改

MFC 在编辑控件框中显示多行文本

MFC 列表控件滚动显示额外的网格线