代码之家  ›  专栏  ›  技术社区  ›  Wil

有没有更好的方法来禁用复选框?

  •  1
  • Wil  · 技术社区  · 14 年前

    我正在处理一个应用程序,该应用程序有许多复选框未选中,每个复选框都有一个关联的文本框,在选中该复选框之前,该文本框将被禁用。

    我正在经历,目前一个接一个地做一个“如果被选中,启用,如果不被选中,禁用”-但这需要永远!

    有没有更快的方法可以加快这个过程?

    我没有陈述语言,因为我不确定它是否重要-我在用VB编程,但是我只想在正确的(语言独立的)方向上前进一步,我可以从那里进一步研究。

    7 回复  |  直到 14 年前
        1
  •  5
  •   Dustin Hodges    14 年前

    为什么不创建一个具有复选框和文本框的控件,并处理该控件中文本框的启用/禁用?

        2
  •  6
  •   SLaks    14 年前

    您可以创建一个函数,该函数接受一个复选框和一个文本框,并处理该复选框的事件以禁用该文本框。

    然后,您只需为每对函数调用一次。

    例如:(用c表示)

    void BindCheckbox(CheckBox checkbox, Control targetControl) {
        targetControl.Enabled = checbkox.checked;
        checkbox.CheckedChanged += delegate { targetControl.Enabled = checbkox.checked; };
    }
    
    BindCheckbox(someCheckbox, someTextbox);
    
        3
  •  0
  •   Robert    14 年前

    如果可以将它们包含在同一个包含元素中,例如 <td> 你做了一个概括 onchange 对于复选框。如果不是,只需调整下面代码的DOM横向,以找到正确的文本框。

    JQuery

    $('input:checkbox').change(function() {
       //$(this).siblings('yourTextbox').attr('disabled',!this.checked);
    });
    

    这是一把小提琴,用于演示: http://jsfiddle.net/robert/WTAw8/

    编辑 我想我完全误解了你要找的语言……这是基于jquery/javascript的…所以如果你不做基于网络的工作,就忽略这一点。

        4
  •  0
  •   weiy    14 年前

    您可以让所有的复选框调用一个事件处理程序,并传递一些标识符。在事件处理程序中,基于该标识符禁用/启用关联的文本框。(我假设每个复选框/文本框对以某种方式命名类似)

        5
  •  0
  •   Scott Chamberlain    14 年前

    对于类似的问题,我使用的一种方法是 Name 属性的复选框,将文本字段命名为类似的内容,它们可以相互引用。

    C例

    //assume the checkboxs are named cbxfield1, cbxfield2, ect. and the text box is named txtfield1, txtfield2, ect.
    
    public void CheckBoxChecked(object sender, EventArgs e)
    {
         var checkBox = (CheckBox)sender;
         var name = checkNox.Name.Substring(3);
         var textBox = (TextBox)containerWithTextFields.Controls["txt"+name];
         textBox.Enabled = checkBox.Checked;
    }
    
        6
  •  0
  •   jaredmroberts    14 年前

    我将为您页面上的每个单选按钮文本框组合添加一个面板。在面板中,确保复选框和关联的文本框包含在其中。然后在表单的.vb文件中添加以下内容。确保为每个复选框的checkChanged事件添加一个处理程序。

    Private Sub chk_CheckedChanged(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles _
        chk1.CheckedChanged, chk2.CheckedChanged
        Dim chk As CheckBox = CType(sender, CheckBox)
        For Each ctrl As Control In chk.Parent.Controls
            If ctrl.Name <> chk.Name AndAlso ctrl.GetType() Is GetType(TextBox) Then
                CType(ctrl, TextBox).Enabled = chk.Checked
            End If
        Next
    End Sub
    
        7
  •  0
  •   Dustin Hodges    14 年前

    这是另一个我认为更接近OP想要的答案。创建复选框/文本框管理器控件以将复选框映射到类似于 this TeleRik RADAJAXMIX控制。 然后,用管理员注册一个复选框,然后注册要启用/禁用的每个文本框。

    对象模型如下所示:

    Public Class CTManager
        CheckToTextMappingCollection Mappings
    End Class
    
    Public Class CheckToTextMappingCollection
        Inherits List(Of CheckToTextMapping)
    End Class
    
    Public Class CheckToTextMapping
        Public Property CheckBox As CheckBox
        Public Property IEnumerable<TextBox> AffectedTextBoxes
    
        Public Sub New(ByVal CheckBox As CheckBox)
            Me.CheckBox = CheckBox
    
            AddHandler CheckBox.CheckedChanged, AddressOf CheckBoxChanged
        End Sub
    
        Public Sub AddTextBox(ByVal TextBox As TextBox)
            AffectedTextBoxes.Add(TextBox)
        End Sub
    
        Public Sub CheckBoxChanged(ByVal sender As Object, ByVal e As System.EventArgs)
            For Each tb As TextBox in AffectedTextBoxes
                tb.Enabled = CheckBox.Checked
            Next
        End Sub
    End Class
    
    **** Untested ****    
    

    这样做可以使其更具可扩展性(事件处理程序等中可能存在启用/禁用的不同规则),并将处理此问题的逻辑很好地分离到自己的对象中。