0

我有一个用 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"))

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

“网格”不是“字符串”的成员

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

4

2 回答 2

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 的成员变量来引用在您的选项卡控件中选择的任何选项卡页上存在的网格。

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

希望有帮助!

于 2013-01-27T13:34:26.173 回答
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
于 2013-01-27T13:42:25.657 回答