我正在研究一个应用程序,其中有许多复选框未启用,每个复选框都有一个关联的文本框,该复选框在复选框被选中之前被禁用。有没有更好的方法来禁用复选框?
我正在经历和目前一个一个做一个“如果选中,启用,如果不检查,禁用” - 但它是永远!
有没有更快的方法/我应该使用的方法会加快这个过程?
我没有说明语言,因为我不确定它的问题 - 我在VB编程,但我只是想在右(语言无关)的方向推,我可以从那里进一步研究。
我正在研究一个应用程序,其中有许多复选框未启用,每个复选框都有一个关联的文本框,该复选框在复选框被选中之前被禁用。有没有更好的方法来禁用复选框?
我正在经历和目前一个一个做一个“如果选中,启用,如果不检查,禁用” - 但它是永远!
有没有更快的方法/我应该使用的方法会加快这个过程?
我没有说明语言,因为我不确定它的问题 - 我在VB编程,但我只是想在右(语言无关)的方向推,我可以从那里进一步研究。
为什么不创建一个具有复选框,文本框,并处理该控件中的文本框的启用/禁用的控制?
这就是我通常做的并且很棒的作品!不需要复杂的事件或查看控制名称。 – 2010-11-05 20:44:50
这只有在控件相邻时才有用。 – SLaks 2010-11-05 20:52:33
为真。我认为他们是相邻的,但是没有任何地方显示这个 – 2010-11-05 22:02:13
如果您可以将它们包含在相同的包含元素中,例如<td>
,您可以为该复选框执行一般化的onchange
。如果没有,只需调整下面代码的DOM横向以找到正确的文本框。
$('input:checkbox').change(function() {
//$(this).siblings('yourTextbox').attr('disabled',!this.checked);
});
这里有一个小提琴,用于演示目的:http://jsfiddle.net/robert/WTAw8/
编辑 我想我完全误解你要找的语言....这是jQuery的/基于JavaScript ...如果你没有做基于网络的话,那么就忽略这个。
第一次阅读时,我不得不回头再读一遍,因为他说“语言无关” – 2010-11-07 19:26:48
你可以让所有的复选框调用一个单独的事件处理程序,传递一些标识符。并在事件处理程序中,根据该标识禁用/启用关联的文本框。 (我假设每个复选框/文本框对以某种方式命名相似)
我用于类似问题的一种方法是使用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;
}
你可以让一个函数,一个复选框和一个文本框,并处理的复选框的情况下,禁用文本框。
然后你可以简单地为每一对调用函数一次。
例如:(在C#)
void BindCheckbox(CheckBox checkbox, Control targetControl) {
targetControl.Enabled = checbkox.checked;
checkbox.CheckedChanged += delegate { targetControl.Enabled = checbkox.checked; };
}
BindCheckbox(someCheckbox, someTextbox);
我会为您在页面上的每个单选按钮文本框组合添加一个面板。在面板中确保复选框和相关文本框包含在其中。然后在表单的.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
这是另外一个答案,我认为它更接近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 ****
这样做,这样使得它更具可扩展性(为实现不同的规则/禁用的事件处理程序等可以去)以及用于分隔很好处理这个逻辑进入自己的对象。
...不确定标签上,为什么不再允许最佳做法? – Wil 2010-11-05 19:40:07
回复:你的问题,你在用什么界面? Re:标签,它是清除主观问题努力的一部分。部分原因是我们现在有程序员.stackexchange.com,这对于最佳实践问题更适合。 – Will 2010-11-05 19:45:19
WinForms? WPF? HTML? Silverlight的? – SLaks 2010-11-05 19:45:44