Это, ЕСЛИ - Еще лестничная структура, которую я создал, чтобы сфокусировать сначала видимое управление на моей форме. Согласно требованию любое управление может быть скрыто на форме. Таким образом, я должен был найти сначала видимое управление и сфокусировать его.
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. Предложите.
Я считаю, что ваше дерево хорошее. Это определенно выглядит как логическое дерево, которое можно упростить, и у вас есть хорошее обоняние, чтобы относиться к нему с подозрением. Однако похоже, что логическое дерево отражает то, что вам нужно. Логика на самом деле очень запутанная , и это условная структура, которую C # дает вам для обработки этой ситуации. Я не думаю, что это можно улучшить.
Если у вас есть простой список элементов управления, которые должны быть в фокусе, и вы хотите установить фокус на первый видимый элемент управления в списке, вы могли бы сделать это:
(From c in ListOfControls
Where c.visible = true
Select c).First.Focus();
Но, похоже, у вас есть дополнительные критерии, так что это не сработает.
Вы можете перебирать элементы управления и устанавливать фокус, если они видны. Но я бы посоветовал вам использовать шаблон состояния для лучшей читаемости кода.
Что насчет прыжка, похоже, вы могли бы использовать это здесь.
Когда список элементов для оценки велик (а иногда он очень ), я пытаюсь отделить порядок оценки от условной логики, примерно так:
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();
}
Если вы просто пытаетесь сфокусировать первый видимый элемент управления на форме, я бы заменил всю лестницу одним циклом:
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;
}
}
}
Вы можете вернуться после того, как будете соответствовать вашим критериям, например:
if (ddlTranscriptionMethod.Visible)
{
ddlTranscriptionMethod.Focus();
return;
}
if (ddlSpeechRecognition.Visible)
{
ddlSpeechRecognition.Focus();
return;
}
и т. Д.
Все, что вы делаете, - это установка фокуса на клиентскую функциональность. Я бы лично сделал это в javascript (используя jQuery). Элементы управления ASP.NET, которые не настроены как видимые, не отображаются в HTML, поэтому вы можете проверить наличие этих элементов или может быть более простой способ, если вы просто ищете первый видимый включенный элемент управления.
Это классический конечный автомат. Установив машину, он может упростить понимание и поддержку кода, , хотя может добавить к общему количеству строк .
Я не буду вдаваться в подробности вашего кода. Определяя, в каком состоянии работает пользователь, вы можете программно изменять различные значения понятным способом для конкретного состояния . (Псевдокод ниже)
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.
Два подхода:
Вот немного другой взгляд на проблему. Сначала определите интерфейс для представления элементов управления, которые могут или не могут быть сфокусированы:
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 ()
при необходимости.