如何在TabPage中访问动态添加的DataGridView并获取值?

时间:2018-02-02 05:06:52

标签: c# excel datagridview tabcontrol tabpage

我制作了一个程序,可以导入excel文件,并在动态添加的标签页中插入所有工作表,并附带动态添加的数据网格视图。

我想根据我在组合框中选择的选项卡插入KPI列的值,每次更改标签页时,组合框也会更改。 image

以下是我的代码:

ReadExcel方法

  public static void ReadExcel(ComboBox cboSheet, TabControl tabCon)
    {
       try
       {
           OpenFileDialog openFileDialog = new OpenFileDialog();
           openFileDialog.Filter = "Excel Files| *.xls; *xlsx";
           openFileDialog.ShowDialog();

           if (!string.IsNullOrEmpty(openFileDialog.FileName))
           {
               OleDbcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + openFileDialog.FileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'");
               OleDbcon.Open();

               DataTable dt = OleDbcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
               OleDbcon.Close();

               cboSheet.Items.Clear();

               int width = 1330;
               int height = 565;
               //1338, 590

               for (int i = 0; i < dt.Rows.Count; i++)
               {
                    if (!dt.Rows[i]["Table_Name"].ToString().Contains("FilterDatabase") && !dt.Rows[i]["Table_Name"].ToString().EndsWith("$'"))
                    {
                       String sheetName = dt.Rows[i]["Table_Name"].ToString();
                       sheetName = sheetName.Substring(0, sheetName.Length - 1);
                        //cboSheet.Items.Add(sheetName);

                        TabPage tp = new TabPage(sheetName);

                        DataGridView dataGridView = new DataGridView();
                        tp.Controls.Add(dataGridView);
                        tabCon.Controls.Add(tp);
                        CreateDataGrid(dataGridView, sheetName);
                        dataGridView.Size = new Size(width, height);
                        System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle = new System.Windows.Forms.DataGridViewCellStyle();

                        //KPI Column
                    }
               }
           }
       }

       catch (Exception e)
       {
           MessageBox.Show(e.ToString());

       }

    }

CreateDataGrid方法

  public static void CreateDataGrid(DataGridView dataGridView1, string TabName)
    {
        OleDbDataAdapter oleAdapt = new OleDbDataAdapter("Select * from [" + TabName + "$]", ExcelMethods.OleDbcon);


        DataTable dt = new DataTable();

        oleAdapt.Fill(dt);

        dataGridView1.DataSource = dt;
    }

1 个答案:

答案 0 :(得分:0)

下面是一个简单的win form程序,它演示了我在评论中描述的内容。表单包含一个名为ComboBox的空cb_KPI。此外,它还包含一个名为TabControl的空tabControl1

创建全局变量AllDataTablesAlldataTablesDataSetDataTable中的每个DataSet都是用户选择的Excel工作簿中的现有工作表。这用于保存每个DataTable的{​​{1}} ...,TabPageAllDataTables.Tables[0]的{​​{1}}。

加载表单后,DataTable将填充用户选择的工作簿的工作表...然后,遍历所有表的循环会为每个表的tabControl1.TabPages[0]添加新的AllDataTables。最后,TabPage组合框会更新,以包含当前所选tabControl1的值。

cb_KPI

TabPage方法从用户选择的Excel文件中返回DataSet AllDataTables; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { AllDataTables = GetDSFromExcel(); foreach (DataTable dt in AllDataTables.Tables) { tabControl1.TabPages.Add(GetTabPageWithGrid(dt)); } cb_KPI.DataSource = SetKPI_ValuesForComboBox(AllDataTables.Tables[tabControl1.SelectedIndex]); } ,其中GetDSFromExcel中的每个DataSet都是用户选择的Excel文件中的工作表。

DataTable

DataSet方法获得private DataSet GetDSFromExcel() { DataSet ds = new DataSet(); try { OpenFileDialog openFileDialog = new OpenFileDialog { Filter = "Excel Files| *.xls; *xlsx" }; openFileDialog.ShowDialog(); if (!string.IsNullOrEmpty(openFileDialog.FileName)) { using (OleDbConnection OleDbcon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + openFileDialog.FileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'")) { OleDbcon.Open(); DataTable WorkbookSheetInfo = OleDbcon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); String sheetName; DataTable dt; OleDbDataAdapter oleAdapt; for (int i = 0; i < WorkbookSheetInfo.Rows.Count; i++) { if ((WorkbookSheetInfo.Rows[i]["Table_Name"].ToString().EndsWith("$'")) || (WorkbookSheetInfo.Rows[i]["Table_Name"].ToString().EndsWith("$"))) { sheetName = WorkbookSheetInfo.Rows[i]["Table_Name"].ToString(); dt = new DataTable(sheetName.Replace("'", "").Replace("$", "")); oleAdapt = new OleDbDataAdapter("Select * from [" + sheetName + "]", OleDbcon); oleAdapt.Fill(dt); ds.Tables.Add(dt); } } } } } catch (Exception e) { MessageBox.Show("ReadExcelIntoDS_Error" + e.ToString()); } return ds; } 并返回GetTabPageWithGridDataTableTabPage DataGridViewDataGridView是给定的DataSource

DataTable

接下来是在用户选择其他标签页时保持private TabPage GetTabPageWithGrid(DataTable dt) { TabPage tp = new TabPage(dt.TableName.Replace("'", "").Replace("$", "")); tp.Controls.Add(GetDGV(dt)); return tp; } private DataGridView GetDGV(DataTable dt) { return new DataGridView { Size = new Size(1000, 400), Name = "datagridView" + dt.TableName, DataSource = dt, ScrollBars = ScrollBars.Both }; } 组合框一致的所需代码。在这里联系cb_KPI TabControls事件可能会有所帮助,代码只是遍历SelectedIndexChanged并收集所有不同的“KPI”字符串值并将它们存储到DataTable中然后返回完成的列表。然后,此新列表将用作List<string>组合框的DataSource。显然,如果cb_KPI很大或有许多不同的表,您可以考虑保存这些字符串列表,而不是每次用户选择不同的选项卡时重新生成列表。注意:下面的代码假定表中有一列名为“KPI”。

DataTable

我希望这会有所帮助。