首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何从动态创建的datagridview中获取数据在tabcontrol中动态制作标签页

C#如何从动态创建的datagridview中获取数据在tabcontrol中动态制作标签页
EN

Stack Overflow用户
提问于 2016-07-05 21:00:44
回答 1查看 617关注 0票数 1

我正在寻找一些解决方案,如何从动态创建的tabcontrol中动态创建的tabpage中的datagridview获取数据。在我创建了网格视图之后,我从Excel文件中填充它。如果我没有在我的项目中永久地创建特定的datagridview,我不知道如何在其他方法中调用它。

下面是我的方法的代码,我如何在TabControl中动态生成选项卡页和填充动态创建的datagridview。任何帮助都将不胜感激:-)

代码语言:javascript
复制
private void FillPages()
{
    try
    {
        for (int i = 0; i <= listView.Items.Count - 1; i++)
        {
            string path = listView.Items[i].Text.ToString();
            Variables.fileNameWithoutExtension = Path.GetFileNameWithoutExtension(path);
            Variables.FullPath = listView.Items[i].Text.ToString();
            string valueMonth = comboBoxMonth.Text.ToString();
            string valueYear = comboBoxYear.Text.ToString();

            string excelQuery = "select * from [AAB$]";

            try
            {
                    string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                                              + path + ";Extended Properties=\"Excel 12.0;HDR=YES;\";";
                    OleDbConnection con = new OleDbConnection(connectionString);
                    OleDbCommand cmdOLEDB = new OleDbCommand(excelQuery, con);
                    con.Open();

                    OleDbDataAdapter da = new OleDbDataAdapter(cmdOLEDB);
                    DataTable data = new DataTable();
                    da.Fill(data);

                    Variables.fileName = Path.GetFileName(path);
                    TabPage tab = new TabPage();
                    tab.Text = Variables.fileNameWithoutExtension;
                    DataGridView grid = new DataGridView();
                    grid.Dock = DockStyle.Fill;
                    grid.AllowUserToAddRows = false;

                    grid.DataSource = data;
                    grid.AutoResizeColumns();
                    grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                    tab.Controls.Add(grid);
                    tabControlForDataUploaded.Controls.Add(tab);
                    labelTabName.Text = tabControlForDataUploaded.TabPages[0].Text.ToString();
                    con.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-07-05 22:07:46

绑定DataGridView是其底层DataSource的一种显示机制。在大多数情况下,您应该关注从底层来源获取数据,而不是“从网格获取数据”。在上面的代码中,您正在动态创建这些源,将它们作为DataSource添加到动态创建的网格中,然后让该方法只有一种方法来访问网格及其源,即钻取到选项卡的controls集合并进行强制转换。

您需要的是一种更直接的方式来存储对数据源的引用和访问。我会在您的表单上定义一个包含DataTables集合的属性,并在将数据表设置为网格的数据源之前将它们添加到此集合中。这样,您以后可以通过访问该集合轻松地访问任意或所有DataTables。

代码语言:javascript
复制
        public Collection<DataTable> Tables { get; set; }
        private void FillPages()
        {
            for (int i = 0; i <= listView.Items.Count - 1; i++)
            {
                // omitted for clarity
                DataTable data = new DataTable();
                grid.DataSource = data;
                Tables.Add(data);
            }
        }
    }

然后后来

代码语言:javascript
复制
    private void AccessData()
    {
        foreach(var table in Tables)
        {
            MessageBox.Show(table.Rows[0]["SomeColumn"].ToString());

        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38204160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档