2013-02-26 39 views
0

寻找在代码创建的另一个选项卡上引用数据网格视图。如何引用位于不同选项卡上的控件VB.NET

我想使用当前选定选项卡中的数据网格视图的列填充组合框。现在我只能得到组合框来填充用户加载的最后一个文件,而不是选择了w/e选项卡。

Dim mstrFirstFile As String = "" 
Dim mstrFileName As String = "" 
Dim mdstTableInput As New DataSet 
Dim mintCounter As Integer 
Dim mdgvTab As DataGridView 

Public Function CreateNewDGVInsideNewPageTab() As DataGridView 
    Dim tbpNewTab As New TabPage() 
    tbpNewTab.Text = mstrFileName 

    Dim mdgvTabControl As New DataGridView 
    mdgvTabControl.Dock = DockStyle.Fill 
    mdgvTabControl.Name = ("Grid" + ToString(mintCounter)) 

    tbpNewTab.Controls.Add(mdgvTabControl) 
    tbcsource.TabPages.Add(tbpNewTab) 
    tbcsource.SelectedTab = tbpNewTab 
    Return mdgvTabControl 
End Function 

Private Sub generate() 

    Dim objCLSConverter As New DataTier.clsCSVConverter 
    Dim strNewXMLPath As String = "" 
    Dim xmlFile As XmlReader 

    If mstrFirstFile.Length > 1 Then 


     strNewXMLPath = objCLSConverter.writeXML(mstrFirstFile) 

     xmlFile = XmlReader.Create(strNewXMLPath, New XmlReaderSettings()) 

     Dim dsTemp As DataSet = New DataSet 
     Dim dtTable As DataTable = Nothing 

     dsTemp.ReadXml(xmlFile) 
     dtTable = dsTemp.Tables(0).Copy 
     dtTable.TableName = mintCounter 
     mdstTableInput.Tables.Add(dtTable) 

     mdgvTab = CreateNewDGVInsideNewPageTab() 

     mdgvTab.DataSource = mdstTableInput.Tables(mintCounter) 

     mintCounter = (mintCounter + 1) 

     cbxColumnsUpdate() 

     xmlFile.Close() 

    End If 
End Sub 

任何帮助或如果你需要更多的我的代码让我知道。


该程序将用户添加并将其扔入数据集中的任何.csv或.xls文件。它将这些文件添加到一个新的代码生成的Tab中,里面有一个数据网格视图,并将文件加载到其中。

当选择一个选项卡时,组合框将填充该选项卡数据网格视图的所有列名称,您可以选择任何选项卡,并且它将重新填充该选项卡的组合框。然后,您可以从组合框中选择列名称,然后在文本框中输入您要在该列中搜索的文本框,它只是一个select where子句。

然后这些数据将被扔进下面的数据网格视图,供用户查看并导出为ex​​cel或继续更改。这是为了一般的报告目的和按摩数据。

现在问题是组合框将不会基于所选标签重新填充。

+0

如果在设计时,应控制可在形式层面。在运行时,每个选项卡控件都包含标签页。只需引用TabPage.Controls。 – Neolisk 2013-02-26 18:26:54

+0

有我这样的例子吗?编码不太好:P.然后试图引用该选项卡中的数据网格视图似乎有点棘手加入它们。 – Xnub 2013-02-26 18:39:04

+0

细节很少,很难说清楚。一种选择是使用'mdgvTab.Controls(“Grid”+ ToString(mintCounter))'',但最好保留一个'ToString(mintCounter),DataGridView'的Dictionary。你需要使用字典的例子吗? – Neolisk 2013-02-26 18:57:09

回答

0

只是一种选择 - 转换这样的:

Dim mdgvTab As DataGridView 

字典:

Dim mdgvTabDictionary As Dictionary(Of Integer, DataGridView) 

然后,里面Sub generate()您更换此:

mdgvTab = CreateNewDGVInsideNewPageTab() 

这样:

Dim mdgvTab As DataGridView = CreateNewDGVInsideNewPageTab() 
mdgvTabDictionary.Add(mintCounter, mdgvTab) 

现在您不需要处理控制层次结构并按名称查找控件。相反,您可以通过索引找到您需要的DataGridViewmdgvTabDictionary(index)

不要忘记Sub New,初始化mdgvTabDictionary(或任何其他地方,如适用于您的情况):

mdgvTabDictionary = New Dictionary(Of Integer, DataGridView) 
+0

当我尝试使用'strColNames(i)= mdgvTabDictionary(mintCounter).Columns(i).Name'时,得到错误“给定的键没有出现在字典中”,因为它对我来说有点奇怪。 – Xnub 2013-02-27 16:16:36

+0

@Xnub:如果你增加了'mintCounter',你将它作为'generate'的最后一个语句之一,它将等于'(x + 1)',其中'x'是字典中最大的键,当然,这个关键是不存在的。在做之前,你需要知道你将访问哪个索引。我提到'mintCounter'来显示'Key'值的逻辑理由。你可能不会使用这个特定的变量(从我在代码中看到的)。 – Neolisk 2013-02-27 17:40:48

+0

好吧,我看到使用'mintCounter'的问题。但仍然无法找到一种方法来选择我想要的字典的正确索引。第一个将选择罚款和填充组合框。但如果我添加另一个选项卡它吹起同样的错误,但生成该选项卡的combox,但不再会生成combox,如果我再次选择第一个选项卡。 – Xnub 2013-02-27 19:02:20

相关问题