2016-07-05 54 views
1

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

下面是我的方法代码,我如何在TabControl中动态生成标签页并填充动态创建的datagridviews。任何帮助将非常欣赏:-)

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()); 
    } 
} 
+0

化妆的DataGridView网全球。 –

+1

只是将DataGridView从方法FillPages中声明出来。 –

+0

@sowjanyaattaluri没有很多DataGridViews来获取数据吗?如果是这样,那么一个全局对象引用将不会执行这个技巧。 我只想问一下,使用数据的问题在哪里?你有自己的数据表,绑定到源,然后绑定到datagridview。你是否希望全局访问那些在这个循环之外的数据表,或者你想要一个基本的方法来访问数据库中的数据? –

回答

1

一个绑定的DataGridView是作为它的底层数据源的显示机制。在大多数情况下,您应该关注的是从底层资源获取数据,而不是“从网格获取数据”。在上面的代码中,您将动态创建这些源代码,将它们作为DataSource添加到动态创建的网格中,然后让该方法以唯一的方式访问网格及其源代码,并将其钻取到该选项卡的控件集合中,铸件。

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

 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); 
      } 
     } 
    } 

再后来

private void AccessData() 
    { 
     foreach(var table in Tables) 
     { 
      MessageBox.Show(table.Rows[0]["SomeColumn"].ToString()); 

     } 
    } 
相关问题