我试图将我的代码逻辑从我的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。
我是以正确的方式看待这个吗?或者我到目前为止,有一个明显的原因,这不起作用?
任何输入都将不胜感激!什么是将数据传递回源而不将其作为函数返回的最佳方法?
答案 0 :(得分:2)
您应该考虑稍微更改一下代码,以便更多地反映MVC structure:
因此,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
模块设置为项目的起点:
现在您有一个使用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 :
现在将TextBox控件绑定到DataBinding控件:
剩下的就是以下列形式为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");