2

私はVB.NETとWPFが初めてです。

「アンケート」アプリを構築しています。ユーザーには、さまざまな質問/タスク (ウィンドウ) が順番に表示されます。各質問/タスクに回答して「送信」ボタンを押すと、新しいウィンドウが開き、新しい質問/タスクが表示され、前のウィンドウが閉じます。各質問の後、ボタンが押されたときに、データを何らかのグローバル オブジェクトに保存する必要があります。すべての質問に回答した後、このオブジェクトのデータを出力ファイルに書き出す必要があります。

各ウィンドウの後に結果を保存するには Dictionary が最適であることがわかりました。

このグローバル ディクショナリを作成する方法、場所、アクセス方法がわかりません。ビューモデルを使用する必要がありますか? はいの場合、例を挙げていただけますか?それとも、共有プロパティを持つ単純なクラスにする必要がありますか? (このようなもの)

編集2:オンラインで推奨されるさまざまな方法を試しました

グローバルモジュール:

Module GlobalModule
   Public Foo As String
End Module

グローバル変数:

Public Class GlobalVariables
   Public Shared UserName As String = "Tim Johnson"
   Public Shared UserAge As Integer = 39
End Class

グローバル プロパティ:

Public Class Globals

Public Shared Property One As String
    Get
        Return TryCast(Application.Current.Properties("One"), String)
    End Get
    Set(ByVal value As String)
        Application.Current.Properties("One") = value
    End Set
End Property

Public Shared Property Two As Integer
    Get
        Return Convert.ToInt32(Application.Current.Properties("Two"))
    End Get
    Set(ByVal value As Integer)
        Application.Current.Properties("Two") = value
    End Set
End Property

End Class

これは、最初のウィンドウでデータをグローバル変数/プロパティに保存する場所です。古いウィンドウを閉じて新しいウィンドウを開く前に、このサブルーチンにデータを保存する必要があります。テストのためだけに MessageBox を使用します。

Private Sub btnEnter_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEnter.Click

    Dim instructionWindow As InstructionsWindow

    instructionWindow = New InstructionsWindow()

    Application.Current.Properties("number") = textBoxValue.Text

    Globals.One = "2"
    Globals.Two = 3

    MessageBox.Show("GlobalVariables: UserName=" & GlobalVariables.UserName & " UserAge=" & GlobalVariables.UserAge)

    GlobalVariables.UserName = "Viktor"
    GlobalVariables.UserAge = 34

    GlobalModule.Foo = "Test Foo"


    'testing if it saved tha value
    'MessageBox.Show(Application.Current.Properties("number"))

    Application.Current.MainWindow.Close()

    instructionWindow.ShowDialog()

End Sub

次のサブルーチンは、2 番目のウィンドウでグローバル プロパティ/変数から値を取得しようとしているところですが、メッセージ ボックスは空になります。また、間違った方法で値を代入している、または正しい方法で値を読み取っていない (キャスト?) 場合もあります。

Private Sub FlowDocReader_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles FlowDocReader.Initialized

    ' Get a reference to the Application base class instance.
    Dim currentApplication As Application = Application.Current

    MessageBox.Show(currentApplication.Properties("number"))

    MessageBox.Show("One = " & Globals.One & " Two = " & Globals.Two)

    MessageBox.Show("GlobalVariables: UserName=" & GlobalVariables.UserName & " UserAge=" & GlobalVariables.UserAge)

    MessageBox.Show("GlobalModule.Foo = " & GlobalModule.Foo)

    Dim filename As String = My.Computer.FileSystem.CurrentDirectory & "\instructions.txt"

    Dim paragraph As Paragraph = New Paragraph()
    paragraph.Inlines.Add(System.IO.File.ReadAllText(filename))
    Dim document As FlowDocument = New FlowDocument(paragraph)
    FlowDocReader.Document = document

End Sub

ありがとう。

4

4 に答える 4

2

フォームのパブリックDictionaryプロパティを作成し、このプロパティに辞書を配置するか、 Dictionary引数付きのコンストラクタを作成できます。

于 2013-01-21T00:26:45.543 に答える
0

私が提供したすべてのコードをクラス(どのフォームにも依存しない)にいつでも配置でき、sicのディメンションはこのクラスのSub Newであり、この同じクラスの独自のsubに値の行を追加します)。次に、Dim Updater AsNewMyNewClassNameだけです。Call Updater.SubNameWithAddValues(q1、q2、... qp)を使用して、各続行ボタンでアップデーターを呼び出します。特定のクラスを使用しているため、プログラムのどこにいるかは関係ありません。私のコードで気付いたのは、「キー」またはユーザー名を追加する行は1回しか使用できないため、最後のクエリの後に使用することです。新しいクラスのSub Finishedに入れて、Callとして呼び出します。 Updater.Finished(username、q30、q31、last)

于 2013-01-31T00:50:45.603 に答える
0

あなたはすでにこの辞書を持っていますApplication.Properties
ここを見てください.

于 2013-01-20T10:29:43.867 に答える
0

まず、フォームの先頭またはモジュールで次のように辞書 (リストのリスト) を定義できます。

 Dim dic As New Dictionary(Of String, List(Of String))

ユーザーがフォームで質問を完了すると、次のフォームに進む前に、特定のフォーム番号とクエリ結果を dic の 1 つのレコードに書き込みます (このコードを [次へ] ボタンに配置します)。

 'Assume q1response=3, q2response=4,..., qpresponse="text", etc.
 Dim myValues As New List(Of String)
 myValues.Add(formname)
 myValues.Add(q1response)
 myValues.Add(q2response)
 .
 .
 myValues.Add(qpresponse)
 dic.Add(username, myValues)

ユーザーが完了すると、ディクショナリに複数のレコードが作成されます。それぞれのレコードは名前で始まり、その後に質問の回答が続きます。次を使用して、各レコードがユーザー用の複数の辞書レコードをループできます。

For Each DictionaryEntry In dic 'this loops through dic entries
  Dim str As List(Of String) = DictionaryEntry.Value
    'here you can do whatever you want with results while you read through dic records
    'username will be = str(0)
    'formname will be str(1)
    'q1 response on "formname" will be str(2)
    'q2 response on "formname" will be str(3)
    'q3 response on "formname" will be str(4)
    ...

Next

トリックは、1 人のユーザーの結果を含む複数の辞書レコードが存在することです。レコード 1 には「John Doe,page1,q1,q2,q3」のような結果があり、レコード 2 は「John Doe,page2,q4,q5, q6.」具体的には、上記のループの「str」は、各辞書レコード内のすべての項目を含む文字列データの配列になります。つまり、str(0)、str(1)、str(2)、... です。操作、移動、保存、分析などに必要な情報。

于 2013-01-26T23:57:05.777 に答える