如何引用位于不同选项卡上的控件(VB.NET)

时间:2013-01-27 11:59:15

标签: vb.net datagridview tabs tabcontrol

我有一个用VB.NET编写的应用程序,它从文件中读取数据并在屏幕上显示数据。

根据文件中的数据,程序有一个TabControl,最多有3个选项卡,每个选项卡依次有一个DataGridView用于显示数据。例如,我有一个TabControl,它有一个名为“Saturday”的标签和一个名为“Sunday”的标签。

我遇到的问题是,当我从文件中读取数据时,程序会显示星期六选项卡网格上的所有数据,因为我不确定如何在星期日选项卡上引用网格。

要添加DataGridView,我使用以下代码:

Grid = New DataGridView
Grid.Dock = DockStyle.Fill
Grid.Name = "Grid" & TabControl.SelectedIndex
Grid.Tag = "Grid" & TabControl.SelectedIndex 

这就是我在阅读数据的方式:

If reader.GetAttribute("controltype") = "Tab" Then
    SelectedTab = reader.Name
End If

If reader.Name = "cell" Then
y = y + 1
Grid.Rows(i).Cells(y).Style.BackColor = Color.FromName(reader.ReadElementString("cell"))
End If

我几乎想做的事情就像(伪代码):

SelectedTab.Grid.Rows(i).Cells(y).Style.BackColor = Color.FromName(reader.ReadElementString("cell"))

然而,当我使用上面的代码时,它会抱怨:

  

'网格'不是'字符串'的成员

我希望你理解这个问题。如果您需要澄清,请告诉我

2 个答案:

答案 0 :(得分:0)

您的代码有点不清楚。但是,在我看来,以下一行:

If reader.GetAttribute("controltype") = "Tab" Then
    SelectedTab = reader.Name
End If

正在创造至少一个问题。看起来你试图通过其名称的字符串表示来引用Tabpage控件,但除非我错过了什么,该行实际上正在做的是尝试使tabpage控件类型(“SelectedTab”)引用字符串类型。如果是这种情况,那么您将尝试这样做:

If reader.GetAttribute("controltype") = "Tab" Then
    TabControl1.SelectedTab = TabControl1.TabPages(reader.name)
End If

从您发布的代码中说出来有点难以理解,但这可能会让您走上正确的道路。

++++++++++++

更新:从您的代码中可以看出,您通过将其所在选项卡的索引附加到字符串“grid”来命名每个DGV控件。我将假设您正在使用名为“SelectedTab”的类成员变量来表示在控件中选择的当前选项卡。我会假设你在课堂上做了类似的事情:

'Form-or-class scoped memebr variables:
Private SelectedTab As TabPage
Private SelectedGrid As DataGridView

您应该能够使用以下内容引用活动网格控件:

Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles TabControl1.SelectedIndexChanged

    ' Set SelectedTab member variable to refer to the new selected tab page:
    SelectedTab = TabControl1.SelectedTab

    ' Set the SelectedGrid to refer to the grid control hosted on the selected tab page:
    SelectedGrid = TabControl1.SelectedTab.Controls("Grid" & TabControl1.SelectedIndex.ToString())
End Sub

从这里开始,您应该能够使用SelectedGrid的成员变量来引用当前在选项卡控件中选择了标签页的网格。

仅使用代码片段来解决您的问题是一项挑战。如果您有其他困难,请发布更多代码,以便我们更好地了解其他情况。

希望有所帮助!

答案 1 :(得分:0)

好的,我会做这样的事情。也许您可以简单地使用DataSet将XML数据加载到一行中(如果它们之前已使用DataSet.WriteXML保存)。

    Dim ds As New DataSet
    Dim p As TabPage
    Dim gv As DataGridView

    ds.ReadXml("F:\testdata.xml")
    For i As Integer = TabControl1.TabPages.Count - 1 To 0 Step -1
        TabControl1.TabPages.RemoveAt(i)
    Next

    For Each dt As DataTable In ds.Tables
        p = New TabPage(dt.TableName)
        gv = New DataGridView
        ' ... configure the gv here...
        gv.AutoGenerateColumns = True
        gv.Dock = DockStyle.Fill
        ' ...
        gv.DataSource = dt
        TabControl1.TabPages.Add(p)
        p.Controls.Add(gv)
    Next