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

时间:2010-11-05 19:39:51

标签: vb.net winforms user-interface

我正在开发一个有很多复选框的应用程序,这些复选框从未选中开始,每个复选框都有一个关联的文本框,在复选框被选中之前一直被禁用。

我正在经历并且目前一个接一个地做“如果选中,启用,如果未选中,禁用” - 但它会永远消失!

我应该使用哪种更快的方法/方法来加快这个过程吗?

我没有说出语言,因为我不确定它是否重要 - 我正在使用VB进行编程,但是我只想在正确的(语言无关的)方向上推进,我可以从那里进一步研究。

7 个答案:

答案 0 :(得分:6)

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

然后,您可以简单地为每对调用一次函数。

例如:(在C#中)

void BindCheckbox(CheckBox checkbox, Control targetControl) {
    targetControl.Enabled = checbkox.checked;
    checkbox.CheckedChanged += delegate { targetControl.Enabled = checbkox.checked; };
}

BindCheckbox(someCheckbox, someTextbox);

答案 1 :(得分:5)

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

答案 2 :(得分:0)

如果您可以将它们包含在同一个包含元素中,例如<td>,则会为复选框执行通用onchange。如果没有,只需调整以下代码的DOM横向以找到正确的文本框。

的jQuery

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

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

修改 我想我完全误解了你正在寻找的语言......这是基于jQuery / Javascript的...所以如果你没有基于网络,请忽略它。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我用于类似问题的一种方法是使用复选框的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;
}

答案 5 :(得分:0)

我会为您页面上的每个单选按钮文本框组合添加一个面板。在面板中,确保复选框和关联的文本框包含在其中。然后在表单的.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

答案 6 :(得分:0)

这是另一个尝试我认为更接近OP想要的答案。创建一个复选框/文本框管理器控件,将复选框映射到类似于this telerik radajaxmanager控件所执行的文本框。 然后,您向管理器注册一个复选框,然后注册您要启用/禁用的每个文本框。

对象模型会是这样的:

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 ****    

这样做可以使它更具可扩展性(启用/禁用的不同规则可以放在事件处理程序等中)并将处理它的逻辑分离到它自己的对象中。