我正在寻找一些解决方案如何在tabcontrol中动态创建的tabpage中从动态生成的datagridview获取数据。在我制作网格视图后,我从Excel文件中填充它。如果我还没有在我的项目中永久创建它,我不知道如何在其他方法中调用特定的datagridview。
下面是我的方法代码,我如何生成动态标签页并在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 :(得分: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());
}
}