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

下一个子例程是我试图从第二个窗口中的全局属性/变量中检索值的地方,但消息框显示为空。还有可能是我以错误的方式分配值,或者没有以正确的方式读取它们(强制转换?):

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

你已经有了这本词典,请看Application.Properties
这里。

于 2013-01-20T10:29:43.867 回答
0

首先,您可以在表单开头或模块中定义字典(列表列表)如下

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

当用户在表单上完成问题时,将特定的表单编号和查询结果写入 dic 中的单个记录,然后再转到下一个表单(将此代码放入“下一步”按钮):

 '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

诀窍是会有多个字典记录与一个用户的结果,其中记录一个可以有像“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 回答
0

您始终可以将我提供的所有代码放在一个类中(它将独立于任何形式),并且标注 sic 是此类中的一个子新,并在同一个类中自己的子中更新 .Add values 行)。然后将更新程序调暗为新的 MyNewClassName。使用 Call Updater.SubNameWithAddValues(q1,q2,...qp) 在每个继续按钮中调用 Updater。由于您使用特定的课程,因此您在程序中的哪个位置并不重要。我在代码中注意到的一件事是,您只能使用一次添加“密钥”或用户名的行,因此在最后一次查询后使用它 - 所以将它放在新类的 Sub Finished 中并调用为 Call Updater.Finished(用户名,q30,q31,last)

于 2013-01-31T00:50:45.603 回答