这是我创建的IF -Else梯形图,用于将第一个可见控件聚焦在我的窗体上。根据要求,任何控件都可以隐藏在窗体上。所以我必须找到第一个可见的控件并将其聚焦。
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会占用性能,因为我必须遍历整个页面集合。我在页面很深,有主页。请建议。
答案 0 :(得分:8)
我认为你的树好。这肯定看起来像一个可以简化的逻辑树,你有一个良好的嗅觉怀疑它。但是,似乎逻辑树反映了您的需求。 逻辑确实是这个错综复杂的,这是C#为您提供处理这种情况的条件框架。我不认为它可以改进。
如果您有一个应该具有焦点的简单控件列表,并且您希望将焦点放在列表中的第一个可见控件上,您可以这样做:
(From c in ListOfControls
Where c.visible = true
Select c).First.Focus();
但是,看起来你有一些额外的标准,所以不行。
答案 1 :(得分:3)
两种方法:
答案 2 :(得分:3)
如果您只是想将第一个可见控件聚焦在表单上,那么我会用一个循环替换整个梯形图:
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 :(得分:1)
您可以在符合条件后返回,例如:
if (ddlTranscriptionMethod.Visible)
{
ddlTranscriptionMethod.Focus();
return;
}
if (ddlSpeechRecognition.Visible)
{
ddlSpeechRecognition.Focus();
return;
}
等。
答案 4 :(得分:1)
如果可见,您可以迭代控件并设置焦点。但我建议您使用state pattern来提高代码的可读性。
答案 5 :(得分:1)
您所做的一切都是设置焦点,即客户端功能。我个人会在javascript(使用jQuery)中这样做。未设置为可见的ASP.NET控件不会在HTML中呈现,因此您可以查找这些元素的存在,或者如果您只是查找第一个可见的启用控件,则可能会有更简单的方法。
答案 6 :(得分:0)
跳转怎么样,你可以在这里使用它。
答案 7 :(得分:0)
当要评估的项目列表很大(有时它的非常大)时,我会尝试将评估顺序与条件逻辑分开,如下所示:
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();
}
答案 8 :(得分:0)
这是一款经典的状态机。通过设置一台机器,它可以使代码更易于理解和维护,虽然它可能会增加总线。
我不会深入了解您的代码细节,而是与我裸露在一起。通过确定用户正在操作的状态,您可以以可理解的特定状态方式以编程方式更改不同的值。 (下面的伪代码)
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。 HTH
}
答案 9 :(得分:0)
这个问题略有不同。首先,定义一个接口来表示可能会或可能不会聚焦的控件:
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()
。