2016-07-05 15 views
1

Я ищу какое-то решение, как получить данные из динамически созданного datagridview в динамически созданной вкладке в tabcontrol. После того, как я сделал gridviews, я заполнил его из файлов Excel. Я не знаю, как вызвать конкретное datagridview в другом методе, если я не создал его постоянно в своем проекте.C# как получить данные из динамически созданного datagridview в динамически сделанных вкладках в tabcontrol

Ниже приведен код моего метода, как я генерирую динамические вкладки и заполняю динамически созданные datagridviews в TabControl. Любая помощь будет действительно оценена :-)

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 Нет ли данных DataGridView для получения данных? Если это так, то одна глобальная ссылка на объект не будет делать трюк. Я хотел бы только спросить, где проблема с использованием данных? У вас есть свой собственный datatable, привязывая его к источнику, а затем он привязан к datagridview. Вы хотите, чтобы глобальный доступ к этим данным также находился за пределами этого цикла, или вы просите о базовом способе доступа к данным из базы данных? –

ответ

1

Связанный DataGridView является механизмом отображения его базового источника данных. Вместо того, чтобы «получать данные из сетки», в большинстве случаев вы должны быть заинтересованы в получении данных из основных источников. В приведенном выше коде вы динамически создаете эти источники, добавляя их в качестве источника данных в динамически создаваемую сетку, а затем оставляя метод единственным способом доступа к сетям и их источникам, сверлящим в коллекцию элементов управления вкладки и Кастинг.

Что вам нужно, это более прямой способ хранения ссылок и доступа к источникам данных. Я бы определил свойство в вашей форме, которое содержит коллекцию DataTables, и добавьте ваши данные в эту коллекцию, прежде чем устанавливать их в качестве источника данных для ваших сеток. Таким образом, вы можете получить доступ к любым или всем вашим DataTables простым путем доступа к этой коллекции.

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

     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^