将Button的Enabled属性绑定到变量,并使两个不同Button的此属性互斥

在论坛上提问,没得到回答.自己找了找.找到这么个办法.也实现了,不知道有没有更好的办法.请指教.

问题: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事件中加个判段就可以,不过为了以后更复杂的功能.还是实现这要比较保险.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MFC Radio Button 是一组互斥的按钮,通常用于提供多个选项供用户选择其中一个。为了将这些按钮分组并绑定值,可以使用 MFC 的 Group Box 控件。将多个 Radio Button 放置在同一个 Group Box 中,然后为每个 Radio Button 设置不同的 ID 值和相应的文本标签。 在 MFC 中,可以使用 DDX_Radio 函数将 Radio Button 与一个整数变量绑定在一起。这个整数变量表示用户选择的选项的索引,从0开始计数。DDX_Radio 函数的第一个参数是对话框类的指针,第二个参数是 Radio Button 的组 ID,第三个参数是变量的指针,它将被设置为用户选择的选项的索引。 例如,如果您有三个 Radio Button,它们的组 ID 分别为 IDC_RADIO1、IDC_RADIO2 和 IDC_RADIO3,您可以使用以下代码将它们与一个整数变量绑定在一起: ``` int m_nSelection; // 用于存储用户选择的选项的索引 // 在 DoDataExchange 函数中添加以下代码 void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Radio(pDX, IDC_RADIO1, m_nSelection); DDX_Radio(pDX, IDC_RADIO2, m_nSelection); DDX_Radio(pDX, IDC_RADIO3, m_nSelection); } ``` 然后,您可以在程序中使用 m_nSelection 变量来获取用户选择的选项的索引,并根据需要执行相应的操作。例如,以下代码将显示用户选择的选项的文本标签: ``` CString strSelection; switch (m_nSelection) { case 0: strSelection = _T("Option 1"); break; case 1: strSelection = _T("Option 2"); break; case 2: strSelection = _T("Option 3"); break; } AfxMessageBox(strSelection); ``` 希望能帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值