Есть ли лучший способ сделать отключение на флажок? - PullRequest
1 голос
/ 05 ноября 2010

Я работаю над приложением, которое имеет множество флажков, которые не проверяются, и у каждого есть соответствующее текстовое поле, которое отключено до тех пор, пока флажок не установлен.

Я прохожу, и в настоящее время один за другим делаю «если проверено, включите, если отключено, отключите» - однако это займет вечность!

Есть ли более быстрый способ / метод, который я должен использовать, чтобы ускорить этот процесс?

Я не указывал язык, так как не уверен, что это имеет значение - я программирую на VB, однако мне просто нужен толчок в правильном (не зависящем от языка) направлении, и я могу оттуда продолжить исследования.

Ответы [ 7 ]

6 голосов
/ 05 ноября 2010

Вы можете создать функцию, которая принимает флажок и текстовое поле и обрабатывает событие флажка для отключения текстового поля.

Затем можно просто вызвать функцию один раз для каждой пары.

Дляпример: (в C #)

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

BindCheckbox(someCheckbox, someTextbox);
5 голосов
/ 05 ноября 2010

Почему бы просто не создать элемент управления, который имеет флажок и текстовое поле и обрабатывает включение / отключение текстового поля внутри этого элемента управления?

0 голосов
/ 08 ноября 2010

Вот еще одна попытка ответа, который, я думаю, ближе к тому, что хочет ОП.Создайте элемент управления диспетчера флажков / текстовых полей для сопоставления флажков с текстовыми полями, аналогично тому, что делает этот элемент управления * * * * * 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 ****    

Если сделать это таким образом,он более расширяемый (различные правила для включения / выключения могут использоваться в обработчике событий и т. д.) и разделяет логику для удобной обработки этого в свой собственный объект.

0 голосов
/ 06 ноября 2010

Я бы добавил панель для каждого поля со списком переключателей, которое есть на вашей странице.Убедитесь, что в панели есть флажок и соответствующее текстовое поле.Затем в вашем .vb файле формы добавьте следующее.Убедитесь, что вы добавили обработчик для каждого отмеченного флажка события.

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 голосов
/ 05 ноября 2010

Один метод, который я использовал для аналогичной проблемы, это использование свойства 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 голосов
/ 05 ноября 2010

Вы можете сделать так, чтобы все флажки вызывали один обработчик событий, передавая некоторый идентификатор.А в обработчике событий отключите / включите соответствующее текстовое поле на основе этого идентификатора.(Я предполагаю, что каждая пара флажок / текстовое поле так или иначе названа)

0 голосов
/ 05 ноября 2010

Если вы можете включить их в один и тот же содержащий элемент, такой как <td>, вы делаете обобщенный onchange для флажка. Если нет, просто настройте трансляцию DOM приведенного ниже кода, чтобы найти правильное текстовое поле.

JQuery

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

Вот скрипка для демонстрационных целей: http://jsfiddle.net/robert/WTAw8/

Редактировать Я думаю, что я полностью неправильно понял язык, который вы искали ... это на основе jQuery / Javascript ... так что игнорируйте это, если вы не используете веб-интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...