Как уменьшить это ЕСЛИ ЕЩЕ лестничная структура в c#

Это, ЕСЛИ - Еще лестничная структура, которую я создал, чтобы сфокусировать сначала видимое управление на моей форме. Согласно требованию любое управление может быть скрыто на форме. Таким образом, я должен был найти сначала видимое управление и сфокусировать его.

 if (ddlTranscriptionMethod.Visible)
    {
        ddlTranscriptionMethod.Focus();
    }
    else if (ddlSpeechRecognition.Visible)
    {
        ddlSpeechRecognition.Focus();
    }
    else if (!SliderControl1.SliderDisable)
    {
        SliderControl1.Focus();
    }
    else if (ddlESignature.Visible)
    {
        ddlESignature.Focus();
    }
    else
    {
        if (tblDistributionMethods.Visible)
        {
            if (chkViaFax.Visible)
            {
                chkViaFax.Focus();
            }
            else if (chkViaInterface.Visible)
            {
                chkViaInterface.Focus();
            }
            else if (chkViaPrint.Visible)
            {
                chkViaPrint.Focus();
            }
            else
            {
                chkViaSelfService.Focus();
            }
        }
    }

Есть ли любой другой способ сделать это. Я думал с помощью LINQ, будет пожиратель ресурсов производительность, поскольку у меня есть к поперечному целый набор страницы. Я глубок на странице, которая имеет masterpages. Предложите.

5
задан Patrick Karcher 8 April 2010 в 15:22
поделиться

10 ответов

Я считаю, что ваше дерево хорошее. Это определенно выглядит как логическое дерево, которое можно упростить, и у вас есть хорошее обоняние, чтобы относиться к нему с подозрением. Однако похоже, что логическое дерево отражает то, что вам нужно. Логика на самом деле очень запутанная , и это условная структура, которую C # дает вам для обработки этой ситуации. Я не думаю, что это можно улучшить.

Если у вас есть простой список элементов управления, которые должны быть в фокусе, и вы хотите установить фокус на первый видимый элемент управления в списке, вы могли бы сделать это:

(From c in ListOfControls
Where c.visible = true
Select c).First.Focus();

Но, похоже, у вас есть дополнительные критерии, так что это не сработает.

8
ответ дан 18 December 2019 в 09:48
поделиться

Вы можете перебирать элементы управления и устанавливать фокус, если они видны. Но я бы посоветовал вам использовать шаблон состояния для лучшей читаемости кода.

1
ответ дан 18 December 2019 в 09:48
поделиться

Что насчет прыжка, похоже, вы могли бы использовать это здесь.

0
ответ дан 18 December 2019 в 09:48
поделиться

Когда список элементов для оценки велик (а иногда он очень ), я пытаюсь отделить порядок оценки от условной логики, примерно так:

List<WebControl> wcBasics = new List<WebControl>();
wcBasics.Add(ddlTranscriptionMethod);
wcBasics.Add(ddlSpeechRecognition);
wcBasics.Add(ddlESignature);

List<CheckBox> checks = new List<CheckBox>();
checks.Add(chkViaFax);
checks.Add(chkViaInterface);
checks.Add(chkViaPrint);

private void Focus()
{
    foreach (WebControl c in wcBasics)
        if (c.Visible) {
            c.Focus();
            return;
        }

    if (!tblDistributionMethods.Visible) return;

    foreach (CheckBox chk in checks)
        if (chk.Visible) {
            chk.Focus();
            return;
        }
    }

    chkViaSelfService.Focus();
}
0
ответ дан 18 December 2019 в 09:48
поделиться

Если вы просто пытаетесь сфокусировать первый видимый элемент управления на форме, я бы заменил всю лестницу одним циклом:

foreach (Control c in Controls)
{
    if (c.Visible)
    {
        c.Focus();
        break;
    }
}

Если вам нужно сфокусировать внутренний элемент управления, используйте рекурсивный метод:

bool FocusFirst(ControlCollection controls)
{
    foreach (Control c in controls)
    {
        if (c.Visible)
        {
            c.Focus();
            FocusFirst(c.Controls);
            break;
        }
    }
}
3
ответ дан 18 December 2019 в 09:48
поделиться

Вы можете вернуться после того, как будете соответствовать вашим критериям, например:

   if (ddlTranscriptionMethod.Visible) 
    { 
        ddlTranscriptionMethod.Focus(); 
        return;
    }

    if (ddlSpeechRecognition.Visible) 
    { 
        ddlSpeechRecognition.Focus(); 
        return;
    } 

и т. Д.

1
ответ дан 18 December 2019 в 09:48
поделиться

Все, что вы делаете, - это установка фокуса на клиентскую функциональность. Я бы лично сделал это в javascript (используя jQuery). Элементы управления ASP.NET, которые не настроены как видимые, не отображаются в HTML, поэтому вы можете проверить наличие этих элементов или может быть более простой способ, если вы просто ищете первый видимый включенный элемент управления.

1
ответ дан 18 December 2019 в 09:48
поделиться

Это классический конечный автомат. Установив машину, он может упростить понимание и поддержку кода, , хотя может добавить к общему количеству строк .

Я не буду вдаваться в подробности вашего кода. Определяя, в каком состоянии работает пользователь, вы можете программно изменять различные значения понятным способом для конкретного состояния . (Псевдокод ниже)

enum FormStates
{
    Initial_View
    Working_View
    Edit_View
    Shutdown_View
};

{ // Somewhere in code

switch (theCurrentState)
{

    case Initial_View :
        Control1.Enabled = true;
        Control2.Enabled = true;
        theCurrentState = Working_View;
    break;

   case Working_View
      if (string.empty(Contro1.Text) == false)
      {
          Control2.Enabled = false;
          Speachcontrol.Focus();
          theCurrentState = Edit_view;
      }
      else // Control 2 is operational
      {
         Control1.Enabled = false;
         SliderControl.Focus();
      }

    case Edit_View:
       ...
    break;  

   break;
}

Организуя код по логическим шагам, он упрощает добавление дополнительных состояний, не подвергая опасности огромное if / else.

0
ответ дан 18 December 2019 в 09:48
поделиться

Два подхода:

  1. Итерировать элементы управления и установить фокус, если он виден
  2. Используйте TabIndex и сначала установите фокус. Затем фокус должен переключиться на первый видимый элемент управления
3
ответ дан 18 December 2019 в 09:48
поделиться

Вот немного другой взгляд на проблему. Сначала определите интерфейс для представления элементов управления, которые могут или не могут быть сфокусированы:

public interface IFormControl
{
    bool Focus();
}

Затем создайте реализацию, которая обрабатывает простые случаи:

public class FormControl : IFormControl
{
    private readonly Control _control;

    public FormControl(Control control)
    {
        _control = control;
    }

    public bool Focus()
    {
        if(_control.Visible)
        {
            _control.Focus();
        }

        return _control.Visible;
    }
}

И создайте другую реализацию, которая обрабатывает более сложные случаи:

public class DependentFormControl : IFormControl
{
    private readonly Control _control;
    private readonly Func<bool> _prerequisite;

    public DependentFormControl(Control control, Func<bool> prerequisite)
    {
        _control = control;
        _prerequisite = prerequisite;
    }

    public bool Focus()
    {
        var focused = _prerequisite() && _control.Visible;

        if(focused)
        {
            _control.Focus();
        }

        return focused;
    }
}

Затем создайте расширение метод, который устанавливает фокус на первом элементе управления в последовательности:

public static void FocusFirst(this IEnumerable<IFormControl> formControls)
{
    var focused = false;

    foreach(var formControl in formControls)
    {
        if(formControl.Focus())
        {
            break;
        }
    }
}

И, наконец, создайте набор элементов управления для фокусировки:

var controls = new FormControl[]
{
    new FormControl(ddlTranscriptionMethod),
    new FormControl(ddlSpeechRecognition),
    new DependentFormControl(SliderControl1, () => !SliderControl1.SliderDisable),
    new FormControl(ddlESignature),
    new DependentFormControl(chkViaFax, () => tblDistributionMethods.Visible),
    new DependentFormControl(chkViaInterface, () => tblDistributionMethods.Visible),
    new DependentFormControl(chkViaPrint, () => tblDistributionMethods.Visible),
    new DependentFormControl(chkViaSelfService, () => tblDistributionMethods.Visible)
};

controls.FocusFirst();

Вы можете создать набор элементов управления при загрузке страницы и просто вызвать .FocusFirst () при необходимости.

0
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: