CSDN-Ada助手 2023-10-10 22:48 采纳率: 1.6%
浏览 18
已结题

关于#mfc#的问题:一班(班级) = 50(总人数),27(男生)

该问题来自社区帖: https://bbs.csdn.net/topics/617390333.为符合问答规范, 该问题经过ChatGPT优化

我需要帮助使用MFC GRID Control控件。

我想要实现一个表格,每个表格都有增加和删除行列的按钮,并且需要绑定相应的信息。

我已经下载了MFC 表格Grid Control的类,下载地址为:

https://www.tsingfun.com/it/cpp/MFC-Grid-control-2-27.html

表格内容绑定school.cfg文件,内容如下:

[成绩]

语文(科目) = 3(名次),80(成绩)

数学 = 5,95

英语 = 7,94

[班级]

一班(班级) = 50(总人数),27(男生),23(女生)

二班 = 48,24,24

英语 = 46,26,20

[兴趣班]

烹饪(兴趣班) = 50(人数),15(课数)

足球 = 5,20

乒乓球 = 7,30

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-11 10:17
    关注

    【以下回答由 GPT 生成】

    首先,我们需要将下载的MFC Grid Control类添加到我们的项目中。

    然后,我们需要在我们的对话框资源中添加一个GRID Control控件。

    接下来,我们需要在对话框类的头文件中添加一个成员变量来引用GRID Control控件,例如:

    CGridCtrl m_grid;
    

    在 OnInitDialog函数中,我们需要对GRID Control控件进行初始化,如下所示:

    BOOL CMyDialog::OnInitDialog()
    {
        CDialog::OnInitDialog();
    
        // 初始化GRID Control控件
        m_grid.CreateGrid(10, 10, WS_CHILD | WS_VISIBLE, CRect(10, 10, 500, 200), this, 123);
    
        return TRUE;
    }
    

    接下来,我们需要解析school.cfg文件并将数据绑定到GRID Control控件中。我们可以使用CStdioFile类来读取文件内容,并使用string和stringstream进行解析,如下所示:

    CStdioFile file;
    CString line;
    
    if (file.Open(_T("school.cfg"), CFile::modeRead))
    {
        while (file.ReadString(line))
        {
            CString section;
            section.Format(_T("[%s]"), _T("成绩"));
    
            if (line == section)
            {
                // 解析成绩部分数据并绑定到GRID Control控件
                BindDataToGrid("成绩", file);
            }
            else if (line == _T("[班级]"))
            {
                // 解析班级部分数据并绑定到GRID Control控件
                BindDataToGrid("班级", file);
            }
            else if (line == _T("[兴趣班]"))
            {
                // 解析兴趣班部分数据并绑定到GRID Control控件
                BindDataToGrid("兴趣班", file);
            }
        }
    
        file.Close();
    }
    

    在BindDataToGrid函数中,我们需要解析每一行的数据并将其绑定到GRID Control控件。我们可以使用GetToken函数和InsertItem函数来实现,如下所示:

    void CMyDialog::BindDataToGrid(CString section, CStdioFile& file)
    {
        CString line, token;
        int row = -1;
    
        while (file.ReadString(line))
        {
            if (line.GetLength() < 2)
                break;
    
            // 获取行标题
            int pos = line.Find(_T("="));
            wxString title = line.Left(pos);
    
            // 获取数据
            stringstream ss(line.Right(line.GetLength() - pos - 1));
            vector<wxString> data;
    
            while (getline(ss, token, ','))
            {
                data.push_back(token);
            }
    
            // 插入行
            row++;
            m_grid.InsertItem(row, section + ": " + title);
    
            // 插入列
            int col = 0;
            for (size_t i = 0; i < data.size(); i++)
            {
                m_grid.SetItemText(row, col, data[i]);
                col++;
            }
        }
    }
    

    最后,我们还需要添加添加行列的按钮,并在点击按钮时进行相应的操作。我们可以使用BN_CLICKED消息和AddRow、AddColumn和DeleteRow、DeleteColumn函数来添加和删除行列,如下所示:

    BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
        ON_BN_CLICKED(IDC_BUTTON_ADD_ROW, &CMyDialog::OnBnClickedButtonAddRow)
        ON_BN_CLICKED(IDC_BUTTON_ADD_COLUMN, &CMyDialog::OnBnClickedButtonAddColumn)
        ON_BN_CLICKED(IDC_BUTTON_DELETE_ROW, &CMyDialog::OnBnClickedButtonDeleteRow)
        ON_BN_CLICKED(IDC_BUTTON_DELETE_COLUMN, &CMyDialog::OnBnClickedButtonDeleteColumn)
    END_MESSAGE_MAP()
    
    void CMyDialog::OnBnClickedButtonAddRow()
    {
        int rowCount = m_grid.GetRowCount();
        m_grid.InsertItem(rowCount, _T("New Row"));
    }
    
    void CMyDialog::OnBnClickedButtonAddColumn()
    {
        int colCount = m_grid.GetColumnCount();
        m_grid.InsertColumn(colCount, _T("New Column"));
    }
    
    void CMyDialog::OnBnClickedButtonDeleteRow()
    {
        int selectedRow = m_grid.GetSelectedItem();
        m_grid.DeleteItem(selectedRow);
    }
    
    void CMyDialog::OnBnClickedButtonDeleteColumn()
    {
        int selectedCol = m_grid.GetSelectedColumn();
        m_grid.DeleteColumn(selectedCol);
    }
    

    以上就是使用MFC GRID Control控件实现题目需求的具体步骤和代码。如果有任何问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 创建了问题 10月10日