2010-11-05 49 views
1

我正在研究一个应用程序,其中有许多复选框未启用,每个复选框都有一个关联的文本框,该复选框在复选框被选中之前被禁用。有没有更好的方法来禁用复选框?

我正在经历和目前一个一个做一个“如果选中,启用,如果不检查,禁用” - 但它是永远!

有没有更快的方法/我应该使用的方法会加快这个过程?

我没有说明语言,因为我不确定它的问题 - 我在VB编程,但我只是想在右(语言无关)的方向推,我可以从那里进一步研究。

+0

...不确定标签上,为什么不再允许最佳做法? – Wil 2010-11-05 19:40:07

+0

回复:你的问题,你在用什么界面? Re:标签,它是清除主观问题努力的一部分。部分原因是我们现在有程序员.stackexchange.com,这对于最佳实践问题更适合。 – Will 2010-11-05 19:45:19

+2

WinForms? WPF? HTML? Silverlight的? – SLaks 2010-11-05 19:45:44

回答

5

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

+0

这就是我通常做的并且很棒的作品!不需要复杂的事件或查看控制名称。 – 2010-11-05 20:44:50

+3

这只有在控件相邻时才有用。 – SLaks 2010-11-05 20:52:33

+0

为真。我认为他们是相邻的,但是没有任何地方显示这个 – 2010-11-05 22:02:13

0

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

jQuery的

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

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

编辑 我想我完全误解你要找的语言....这是jQuery的/基于JavaScript ...如果你没有做基于网络的话,那么就忽略这个。

+1

第一次阅读时,我不得不回头再读一遍,因为他说“语言无关” – 2010-11-07 19:26:48

0

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

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; 
} 
+0

Winforms * shudders * – Will 2010-11-05 19:50:37

+0

+1谢谢你的回答。 – Wil 2010-11-05 22:19:04

6

你可以让一个函数,一个复选框和一个文本框,并处理的复选框的情况下,禁用文本框。

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

例如:(在C#)

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

BindCheckbox(someCheckbox, someTextbox); 
+0

+1我比你喜欢你的解决方案。如果您重命名对象,它不会中断。 – 2010-11-05 19:53:11

+0

非常感谢 - 我正在努力实现这一点。 – Wil 2010-11-05 22:14:18

+0

我试图实现这一点,但它并不完美,因为我更喜欢每个人都可以在没有任何手动代码的情况下工作的方式......我想我可能会选择控制方法,但是非常感谢就像我希望这种方法能够帮助我进行另一个项目一样。 – Wil 2010-11-05 22:38:16

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 
0

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

对象模型将是这样的:

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

这样做,这样使得它更具可扩展性(为实现不同的规则/禁用的事件处理程序等可以去)以及用于分隔很好处理这个逻辑进入自己的对象。

相关问题