VB.net对MVC的理解和约束

时间:2014-05-24 03:21:08

标签: vb.net

我试图将我的代码逻辑从我的gui中分离出来,就像在MVC原则中一样,我想要实现的是非常简单的我相信

我有我的Form1,其中包含一个文本框和按钮,一旦单击该按钮,它会在我的控制器类中加载一个函数,该函数使用实体将字符串添加到数据库,然后应该使用此名称更新文本框。

我认为我需要做的是将原始表单传递给表单上的文本框对象,然后将数据绑定到表单上的文本框对象,这是我已经解开的地方,因为我的逻辑失败...

Public Class Form1
    Private mf As New MainForm(Me)
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        mf.buttonClick()
    End Sub
End Class

Public Class MainForm
    Private Property a As Form
    Public Sub New(ByVal s As Form)
        a = s
    End Sub



    Function buttonClick() As Boolean

        Dim context As TestDBEntities2 = New TestDBEntities2
        Dim newCategory As tTable = New tTable
        newCategory.Name = "Test1 " & Today.DayOfWeek
        context.tTables.Add(newCategory)
        context.SaveChanges()
        Dim current As String = newCategory.Name
        a.DataBindings.Add("text", "TextBox1", current)

        Return True

    End Function

End Class

我的错误: 无法绑定到DataSource上的属性或列Test1 6。

我是以正确的方式看待这个吗?或者我到目前为止,有一个明显的原因,这不起作用?

任何输入都将不胜感激!什么是将数据传递回源而不将其作为函数返回的最佳方法?

2 个答案:

答案 0 :(得分:2)

您应该考虑稍微更改一下代码,以便更多地反映MVC structure

  • 使用Events 交换数据表示操作触发器,而不是使用表单对象
  • 通常控制器知道表单而不是相反,所以在项目中交换它。这也反映了第一点

因此,Windows窗体应用程序的可能解决方案如下所示:

包含一个按钮和一个文本字段的表单,一个用于指示按钮单击的事件和一个用于从表单外部填充TextBox的 WriteOnly 属性:

Public Class MainForm
    Public Event GenerateAndShowEvent()
    ' allow text box filling
    Public WriteOnly Property SetTextBoxContent()
        Set(ByVal value)
            generatedInputTextBox.Text = value
        End Set
    End Property

    Private Sub generateAndShowButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles generateAndShowButton.Click
        ' forward message: inform the subscriber that something happened
        RaiseEvent GenerateAndShowEvent()
    End Sub
End Class

控制器类具有表单知识,创建表单,绑定(监听)表单的按钮单击事件,并为世界创建表单ReadOnly(公开表单):

Public Class MainFormController
    ' the form that the controller manages
    Private dialog As MainForm = Nothing

    Public Sub New()
        dialog = New MainForm()
        ' bind to the form button click event in order to generate the text and response
        AddHandler dialog.GenerateAndShowEvent, AddressOf Me.GenerateAndShowText
    End Sub

    ' allow the world to access readonly the form - used to start the application
    Public ReadOnly Property GetMainForm()
        Get
            Return dialog
        End Get
    End Property

    Private Sub GenerateAndShowText()
        ' create the text
        Dim text As String = "Test test test"
        ' access the Database ...
        ' give the generated text to the UI = MainForm dialog!
        dialog.SetTextBoxContent = text
    End Sub

End Class

现在剩下的就是首先创建控制器,创建表单并使用表单来显示它。这可以这样做:

使用Main方法创建 AppStarter 模块:

Module AppStarter
    Sub Main()
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        ' create the controller object
        Dim controller As MainFormController = New MainFormController()
        ' use the public property to get the dialog
        Application.Run(controller.GetMainForm)
    End Sub
End Module

在项目设置中,取消选中启用应用程序框架设置,并将AppStarter模块设置为项目的起点:

enter image description here

现在您有一个使用MVC模式的Windows窗体项目。

如果您仍想将DataBinding用于TextBox控件,请创建一个Data Transfer Object or DTO,表示您将从控制器传输到表单的字段:

Public Class DataContainer
    Private t As String
    Private i As Integer

    Public Property Text() As String
        Get
            Return t
        End Get
        Set(ByVal value As String)
            t = value
        End Set
    End Property
    Public Property Id() As Integer
        Get
            Return i
        End Get
        Set(ByVal value As Integer)
            i = value
        End Set
    End Property
End Class

然后为TextBox添加BindingSource并将其配置为使用 DTObject

enter image description here

现在将TextBox控件绑定到DataBinding控件:

enter image description here

剩下的就是以下列形式为TextBox数据绑定控件添加公共setter:

Public Property TextBoxDataSource()
    Get
        Return TextBoxBindingSource.DataSource
    End Get
    Set(ByVal value)
        TextBoxBindingSource.DataSource = value
    End Set
End Property

并从控制器传输数据:

Private Sub GenerateAndShowText()
    ' create the text
    Dim text As String = "Test test test"
    ' access the Database ...
    ' give the generated text to the UI = MainForm dialog!
    'dialog.SetTextBoxContent = text
    Dim data As DataContainer = New DataContainer
    data.Text = text
    data.Id = 1 ' not used currently
    dialog.TextBoxDataSource = data
End Sub

也可以通过编程方式设置绑定 - 而不是在控件属性窗口中执行此操作,在窗体的构造函数中添加以下代码:

Public Sub New()
    InitializeComponent()
    ' bind the TextBox control manually to the binding source
    ' first Text is the TextBox.Text property
    ' last Text is the DataContainer.Text property
    generatedInputTextBox.DataBindings.Add(New Binding("Text", TextBoxBindingSource, "Text"))
End Sub

答案 1 :(得分:0)

您似乎误解了Add方法。

第一个参数是您要绑定的控件属性的名称。这应该是"文字"而不是"文字"。

第二个参数是包含要绑定的数据的对象。您已传递目标控件的名称,而不是数据源。您还绑定到表单而不是文本框。所以你要说的是你想要将表单的文本属性绑定到可以从字符串中提取的数据" TextBox1"。

第三个论点说明要去哪里查找数据。例如,如果您为第二个参数传递了一个FileInfo对象,并且想要绑定文件的路径,那么您将传递字符串" FullName",因为这是包含该属性的属性的名称你想要的数据。所以你已经告诉绑定在名为" Test1 6"的字符串类中查找属性,这就是为什么你收到了错误信息,说它无法找到。

我认为你想要的是

a.TextBox1.DataBindings.Add("Text", newCategory, "Name");