无法引用文本框,因为我还没有创建它

时间:2012-05-06 06:56:49

标签: vb.net

我正在使用VB制作一个文件编辑系统,允许用户在Notpad ++等多个标签上编辑多个文件。

虽然我遇到了轻微的障碍。看作标签不包含文字,我在创建时为每个标签添加了一个文本框。

对于加载文件,我想检查当前标签的文本框是否为空,这样我最终不会将加载的文件添加为新选项卡,这只会创建混乱(就像单词打开文件时一样,它检查是否当前文档是未加载的文件,在加载前没有文本。)

问题是,如何使用我尚未添加的标签进行检查? (即在程序运行时添加,而不是在设计模式下添加)

如果有人知道答案,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

我不知道VB.NET,但我在C#中创建了这段代码,检查TabPage是否包含TextBox为空。如果您知道该语言,我认为将其翻译成VB.NET很容易。

这是检查TabPage是否包含空TextBox的函数。该函数接收TabPage作为其参数,并返回truefalse

private bool ContainsEmptyTextBox(TabPage tp)
{
    bool foundTextBox = false;
    bool textBoxIsEmpty = false;
    foreach (Control c in tp.Controls)
    {
        if (c is TextBox)
        {
            foundTextBox = true;
            TextBox tb = c as TextBox;
            if (String.IsNullOrEmpty(tb.Text))
            {
                textBoxIsEmpty = true;
            }
            break;
        }
    }
    if (foundTextBox == true && textBoxIsEmpty == true)
        return true;
    else 
        return false;
}

以下是如何使用该函数迭代TabControl中的所有选项卡,并查看哪一个包含空TextBox:

private void button1_Click(object sender, EventArgs e)
{
    foreach (TabPage tp in tabControl1.TabPages)
    {
        if (ContainsEmptyTextBox(tp))
        {
            // This tabpage contains an empty textbox
            MessageBox.Show(tabControl1.TabPages.IndexOf(tp) + " contains an empty textbox");
        }
    }
}

编辑:我使用this site自动将C#代码转换为VB.NET。

Private Function ContainsEmptyTextBox(tp As TabPage) As Boolean
    Dim foundTextBox As Boolean = False
    Dim textBoxIsEmpty As Boolean = False
    For Each c As Control In tp.Controls
        If TypeOf c Is TextBox Then
            foundTextBox = True
            Dim tb As TextBox = TryCast(c, TextBox)
            If [String].IsNullOrEmpty(tb.Text) Then
                textBoxIsEmpty = True
            End If
            Exit For
        End If
    Next
    If foundTextBox = True AndAlso textBoxIsEmpty = True Then
        Return True
    Else
        Return False
    End If
End Function


Private Sub button1_Click(sender As Object, e As EventArgs)
    For Each tp As TabPage In tabControl1.TabPages
        If ContainsEmptyTextBox(tp) Then
            ' This tabpage contains an empty textbox
            MessageBox.Show(tabControl1.TabPages.IndexOf(tp) & " contains an empty textbox")
        End If
    Next
End Sub

答案 1 :(得分:1)

很久以前我还不得不用C#做一个Notepad ++克隆,需要支持在标签中编辑多个文件。我记得我的表单中有一个List<string> OpenFiles成员,其中包含打开文件的文件名。每次我打开一个新文件,我都会这样做:

  • 将新项目添加到OpenFiles
  • 使用文本框创建新标签并将其添加到TabControl

通过这种方式,OpenFiles列表与TabControl中的选项卡同步。例如,OpenFiles中的第3项是TabControl中第4个选项卡的文件名。

当然,当我打开一个新文件时,我需要先检查文件是否已打开。如果它之前打开过,我切换到它的标签;如果没有,我会打开一个新标签。

拥有OpenFiles成员,这很容易。打开文件的完整算法是:

  • 通过搜索OpenFiles列表
  • 检查文件是否已打开
  • 如果文件已经打开(如果它存在于OpenFiles中),并且其在OpenFiles中的位置为idx(例如),则激活idx标签
  • 如果OpenFiles中不存在该文件
    • 将其添加到最后的OpenFiles
    • 在TabControl
    • 的末尾添加一个带有文本框的新选项卡

关闭文件时(例如关闭idx标签),我这样做了:

  • 检查文件是否已保存,如果没有提示用户是否要保存(是/否/取消消息框)。
    • 如果他选择是,则保存并继续
    • 如果他选择不,则不要保存并继续
    • 如果他选择取消,则中止操作(返回)
  • 从TabControl
  • 中删除idx标签
  • 删除idx列表
  • 中的OpenFiles

我认为您可以在应用程序中应用相同的逻辑。