2016-07-05 23 views
1

나는 tabcontrol에서 동적으로 만든 tabpage에서 동적으로 만든 datagridview에서 데이터를 가져 오는 방법을 찾고 있습니다. gridviews를 만든 후 Excel 파일에서 채 웁니다. 내 프로젝트에서 영구적으로 만들지 않았다면 다른 방법으로 특정 datagridview를 호출하는 방법을 모르겠습니다.C#에서 동적으로 생성 된 DataGridview tabcontrol에서 동적으로 만든 tabpages에서 데이터를 가져 오는 방법

다음은 동적으로 탭 페이지를 생성하고 TabControl에서 동적으로 만든 DataGridview를 채우는 방법의 코드입니다. 모든 도움은 정말 감사하겠습니다 :-)

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

그냥 FillPages 메서드 밖으로 DataGridView 선언하십시오. –

+0

@sowjanyaattaluri 데이터를 가져올 DataGridView가 많지 않습니까? 그렇다면 하나의 전역 객체 참조가 트릭을 수행하지 않습니다. 데이터를 사용할 때의 문제점은 어디까지입니까? 자신의 데이터 테이블을 소스에 바인딩 한 다음 datagridview에 바인딩합니다. 해당 루프 외부에서도 해당 데이터 테이블에 대한 전역 액세스를 원하십니까? 아니면 데이터 테이블에서 데이터를 액세스하는 기본 방법을 묻는 중입니까? –

답변

1

바운드 DataGridView는 기본 DataSource의 표시 메커니즘입니다. "그리드에서 데이터 가져 오기"보다는 대부분의 경우 기본 소스에서 데이터를 가져 오는 것이 중요합니다. 위의 코드에서 동적으로 생성 된 소스를 동적으로 생성 된 격자에 DataSource로 추가 한 다음 해당 탭의 컨트롤 컬렉션으로 드릴하는 격자와 소스에 모두 액세스하는 유일한 방법으로 남겨 둡니다. 주조.

데이터 소스에 대한 참조를 저장하고 데이터 소스에 액세스하는 더 직접적인 방법이 필요합니다. DataTable의 컬렉션을 보유하는 폼의 속성을 정의하고 그리드의 데이터 소스로 설정하기 전에 데이터 테이블을이 컬렉션에 추가합니다. 이렇게하면 나중에 해당 컬렉션에 액세스하여 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()); 

     } 
    }