我正在尝试使用 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 结果的主要内容,如果未能解决你的问题,请参考以下文章