C#无法获取类型为casted Datagridview的数据源

C#无法获取类型为casted Datagridview的数据源,c#,winforms,datagridview,casting,C#,Winforms,Datagridview,Casting,我有一个带有tabpages的TabControl,每个tabpages都有一个datagridview,它在运行时生成,并在运行时再次与数据源绑定。这是执行此操作的代码: foreach (string cat in category) //category is a list of categories I wish to make tabs for { TabPage page = new TabPage(cat); DataGridView data = new Dat

我有一个带有tabpages的TabControl,每个tabpages都有一个datagridview,它在运行时生成,并在运行时再次与数据源绑定。这是执行此操作的代码:

foreach (string cat in category)  //category is a list of categories I wish to make tabs for
{
    TabPage page = new TabPage(cat);
    DataGridView data = new DataGridView();
    data.Name = "Data";
    data.Location = new Point(1, 0);
    data.AllowUserToDeleteRows = false;
    data.ReadOnly = true;
    data.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
    data.MultiSelect = false;

    //here load data for the datagridview
    try
    {
         using (MySqlConnection connection = new MySqlConnection(Class1.connString))
         {
             string sql = "SELECT Code, `Problem Description` FROM problemcode WHERE Category = '" + cat + "' AND Type = 'Problem' ORDER BY `Problem Description`";

             connection.Open();
             using (MySqlCommand cmdSel = new MySqlCommand(sql, connection))
             {
                   DataTable dt = new DataTable();
                   MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
                   da.Fill(dt);
                   data.DataSource = dt;
             }
             connection.Close();
         }
   }
   catch (Exception ex)
   {
        MessageBox.Show("Unable to load problem data.\n\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
   }

   //here I add the datagridview to the tab
   page.Controls.Add(data);
   this.tabControl1.TabPages.Add(page);

   data.CellDoubleClick += new DataGridViewCellEventHandler(data_CellDoubleClick);
   data.CellEnter += new DataGridViewCellEventHandler(data_CellEnter);
}

为了便于讨论,我将仅从一个选项卡讨论datagridview。我想在单击选项卡时访问此datagridview的数据源,但由于它是在运行时生成的,所以我这样做:

BindingSource bs = new BindingSource();
DataGridView selectedDtgv = new DataGridView();

if (tabControl1.SelectedTab.Controls.ContainsKey("Data")) //find datagridview named "Data"
{
    selectedDtgv = (DataGridView)tabControl1.SelectedTab.Controls["Data"];
    bs.DataSource = selectedDtgv.DataSource;
}

但是我在BindSource对象中没有得到任何数据。如果我执行selectedDtgv.Rows.Count之类的操作,它会给我正确的行数,那么为什么它不给我数据源呢?

你能澄清一下
foreach
是在TabPages上遍历的吗?您想显示运行时为每个选项卡页面生成的
datagridview
吗?这是一段稍微简化的代码,我已经让foreach在每个选项卡上创建datagridview工作得很好。我需要的是在单击其中一个选项卡时,获取该选项卡中的datagridview,并获取其数据源,以便将其绑定到其他位置。我的问题是在最后一段代码中,它没有获得selectedDtgv.datasource。我认为简化版的代码增加了更多的混乱。您必须在TabPage的控件集合中添加了datagridview控件。你必须提供更多的信息。学生,很抱歉我反应晚了。我已经用我的实际代码更新了我的原始帖子,它显示了我在一个类别列表中循环,我为每个类别创建了一个datagridview,并将其与从mysql数据库查询的数据绑定。然后我创建一个选项卡,并将datagrid添加到该选项卡中。因此,我的最终结果是一个有许多选项卡的tabcontrol,每个选项卡都有一个datagridview,其中包含自己的数据。现在我的问题是底部的代码块,当我单击一个选项卡时,我希望从该选项卡上特定的datagridview获取数据源,并将其绑定到其他位置。这就是我的问题所在。显然,没有明显的问题。BindingSource对象应获取所选datagridview的数据。能否澄清
foreach
正在TabPages上遍历?您想显示运行时为每个选项卡页面生成的
datagridview
吗?这是一段稍微简化的代码,我已经让foreach在每个选项卡上创建datagridview工作得很好。我需要的是在单击其中一个选项卡时,获取该选项卡中的datagridview,并获取其数据源,以便将其绑定到其他位置。我的问题是在最后一段代码中,它没有获得selectedDtgv.datasource。我认为简化版的代码增加了更多的混乱。您必须在TabPage的控件集合中添加了datagridview控件。你必须提供更多的信息。学生,很抱歉我反应晚了。我已经用我的实际代码更新了我的原始帖子,它显示了我在一个类别列表中循环,我为每个类别创建了一个datagridview,并将其与从mysql数据库查询的数据绑定。然后我创建一个选项卡,并将datagrid添加到该选项卡中。因此,我的最终结果是一个有许多选项卡的tabcontrol,每个选项卡都有一个datagridview,其中包含自己的数据。现在我的问题是底部的代码块,当我单击一个选项卡时,我希望从该选项卡上特定的datagridview获取数据源,并将其绑定到其他位置。这就是我的问题所在。显然,没有明显的问题。BindingSource对象应获取所选datagridview的数据。