2010-11-05 76 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 ****  

這樣做,這樣使得它更具可擴展性(爲實現不同的規則/禁用的事件處理程序等可以去)以及用於分隔很好處理這個邏輯進入自己的對象。

相關問題