0

VB を使用して、ユーザーが Notpad++ のような複数のタブで複数のファイルを編集できるようにするファイル編集システムを作成しています。

ちょっと引っかかったけど。タブにはテキストが含まれていないため、作成時に各タブにテキストボックスを追加します。

ファイルをロードするために、現在のタブのテキストボックスが空であるかどうかを確認したいので、ロードしたファイルを新しいタブとして追加することはありません。ロード前にテキストのない保存されていないファイルです。)

問題は、まだ追加していないタブでこれを確認するにはどうすればよいですか? (つまり、デザイン モードではなく、プログラムの実行中に追加されます)

誰かが答えを知っていれば、それは大歓迎です。

4

2 に答える 2

2

VB.NET はわかりませんが、C# でこのコードを作成しました。このコードは、 aに空の aTabPageが含まれているかどうかを確認します。TextBoxVB.NET の言語を知っていれば、VB.NET に翻訳するのは簡単だと思います。

TabPage に空の TextBox が含まれているかどうかを確認する関数を次に示します。この関数は、TabPage をパラメーターとして受け取り、trueまたはを返しますfalse

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;
}

そして、その関数を使用して a 内のすべてのタブを反復処理し、どのタブに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");
        }
    }
}

編集:このサイトを使用して、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
于 2012-05-06T09:12:41.180 に答える
1

昔、タブで複数のファイルを編集できるようにするために、C# で Notepad++ のクローンを作成する必要がありました。List<string> OpenFiles開いているファイルのファイル名を含むメンバーがフォームにあったことを覚えています。新しいファイルを開くたびに、次のようにします。

  • に新しいアイテムを追加OpenFiles
  • テキスト ボックスを含む新しいタブを作成し、TabControl に追加します。

このようにして、OpenFilesリストは TabControl のタブと同期されました。たとえば、項目 3 はOpenFiles、TabControl の 4 番目のタブのファイル名でした。

もちろん、新しいファイルを開くときは、そのファイルが以前に開かれたかどうかを確認する必要がありました。以前に開いていた場合は、そのタブに切り替えました。そうでない場合は、新しいタブを開きます。

メンバーOpenFilesがいるので、これは簡単でした。ファイルを開くための完全なアルゴリズムは次のとおりです。

  • OpenFilesリストを検索して、ファイルが既に開いているかどうかを確認します
  • ファイルが既に開いていて (ファイルが に存在する場合OpenFiles)、ファイルの位置が でOpenFilesあるidx場合 (たとえば)、idx番目のタブをアクティブにします。
  • ファイルが存在しない場合OpenFiles
    • OpenFiles最後に追加します
    • TabControl の末尾にテキスト ボックスを含む新しいタブを追加します。

ファイルを閉じるとき (たとえばidxth タブを閉じるとき)、私はこれを行いました:

  • ファイルが保存されているかどうかを確認します。保存しない場合は、ユーザーに保存するかどうかを確認します (はい/いいえ/キャンセル メッセージ ボックス)。
    • 彼が「はい」を選択した場合は、保存して続行します
    • 彼が「いいえ」を選択した場合は、保存せずに続行します
    • 彼がキャンセルを選択した場合は、操作を中止します (戻る)
  • idxTabControl から th タブを削除します
  • リストのidxth 項目を削除しますOpenFiles

アプリケーションに同じロジックを適用できると思います。

于 2012-05-06T07:12:10.720 に答える