在论坛上提问,没得到回答.自己找了找.找到这么个办法.也实现了,不知道有没有更好的办法.请指教.
问题:http://topic.csdn.net/u/20120925/12/a817761e-08c7-46f6-ac01-f48abe237504.html?39283
.net framework自带的绑定属性Contros.DataBindings,在msdn上有详细说明.
不过这个绑定和我预想的有点不一样,它绑定的数据源只能是"实现 IBindingList 或 ITypedList 的任何类。包括:DataSet、DataTable、DataView 或 DataViewManager"。而不是我事先想的,只要和属性的数据类型一样的类型就行.不过这也没什么,我用的DataTable,将它的列的数据类型设置成想要的就行了.我再用的过程中也发现数据源也可以是其他控件的属性,当然前提他们的数据类型要适合.
直接上代码吧.
窗体Form1,两个按钮btnStartUpd和btnStopUpd,分别对应上图中的"开始数据更新"和"停止数据更新"
'系统各种状态,两个Button的数据源
Dim ledStatus As New DataTable
Private Sub InitDt()
Dim clms As String() = New String() {"isNotUpdating", "isUpdating"}
For i As Integer = 0 To clms.Length - 1
Dim clmName As String = clms(i).ToString
Dim clm As DataColumn = New DataColumn(clmName)
clm.DataType = GetType(Boolean)
If Me.ledStatus.Columns.IndexOf(clm) = -1 Then
Me.ledStatus.Columns.Add(clm)
End If
Next
Me.ledStatus.Rows.Clear()
Dim newRow As DataRow = Me.ledStatus.NewRow
newRow.Item("isNotUpdating") = True
newRow.Item("isUpdating") = False
Me.ledStatus.Rows.Add(newRow)
AddHandler ledStatus.RowChanged, AddressOf s
End Sub
''' <summary>
''' 当更改开始按钮的Enabled属性时,将停止按钮的Enabled属性值置为相反的值
''' 其实在给数据源的isNotUpdating列赋值时同时给isUpdating列赋相反值也能实现,不过就违背初衷了
''' 更重要的是按现在的方法,可以同时更新更多个有关联的控件的属性,而不必每次都一一列出.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub s(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs)
Dim nu As Boolean = e.Row.Item("isNotUpdating")
Dim u As Boolean = e.Row.Item("isUpdating")
Console.WriteLine("nu:" & nu.ToString & ";u:" & u.ToString)
If nu <> u Then
'这里必须有这个判断,否则就无限递归了
Exit Sub
Else
Dim nnu As Boolean = Not nu
e.Row.Item("isUpdating") = nnu
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
Me.InitDt()
Me.btnStartUpd.DataBindings.Add(New Binding("Enabled", ledStatus, "isNotUpdating"))
Me.btnStopUpd.DataBindings.Add(New Binding("Enabled", ledStatus, "isUpdating"))
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "载入异常")
Me.Close()
Return
End Try
End Sub
'开始按钮
Private Sub btnStartUpd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartUpd.Click
Me.ledStatus.Rows(0).Item("isNotUpdating") = False
End Sub
'停止按钮
Private Sub btnStopUpd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStopUpd.Click
Me.ledStatus.Rows(0).Item("isNotUpdating") = True
End Sub
现在就实现我的目的了,当开始更新数据的时候,我将变量置为false,按钮就不可以点了.当出异常或者其他问题时,就把变量置为true,用户可以通过点击开始按钮,重新开始数据更新.
其实呢,在按钮的click事件中加个判段就可以,不过为了以后更复杂的功能.还是实现这要比较保险.