私の問題は、テキストボックス、チェックボックス、またはコンボボックスがある場合、ページのコントロールを数え、その型を取得し、有効または無効にしたいと思うことです。ネット上に例がありますか?あなたは再帰的に各コントロールをチェックするページのコントロールコレクションを歩かなければならないだろうとページ上のコントロールをカウントする
おかげ
私の問題は、テキストボックス、チェックボックス、またはコンボボックスがある場合、ページのコントロールを数え、その型を取得し、有効または無効にしたいと思うことです。ネット上に例がありますか?あなたは再帰的に各コントロールをチェックするページのコントロールコレクションを歩かなければならないだろうとページ上のコントロールをカウントする
おかげ
あなたが好きな方法を使用できます。
public int CountControls(Control top)
{
int cnt = 1;
foreach (Control c in top.Controls)
cnt += CountControls(c);
return cnt;
}
しかし、アンドリューが言ったように、それは高価になるでしょう。
これは高価な操作になります。おそらく、あなたはASP.NETが親から子へのDisabled
のプロパティをカスケードすることに気づいていないでしょうか?つまり、親コントロールを無効に設定すると、すべての子入力コントロールも無効になります。
編集:あなた本当には、このようにそれをしたい場合、これはそれを行うための最善の方法である:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
int count = 0;
this.disableControls(this, ref count);
}
void disableControls(Control control, ref int count)
{
foreach (Control c in control.Controls)
{
WebControl wc = c as WebControl;
if (wc != null)
{
count++;
wc.Enabled = false;
}
this.disableControls(c, ref count);
}
}
private void ChangeControlStatus(ControlCollection col, bool status)
{
foreach (Control ctrl in col)
ChangeControlStatus(ctrl.Controls, status)
if (ctrl is TextBox)
((TextBox)ctrl).Enabled = status;
else if (ctrl is Button)
((Button)ctrl).Enabled = status;
else if (ctrl is RadioButton)
((RadioButton)ctrl).Enabled = status;
else if (ctrl is ImageButton)
((ImageButton)ctrl).Enabled = status;
else if (ctrl is CheckBox)
((CheckBox)ctrl).Enabled = status;
else if (ctrl is DropDownList)
((DropDownList)ctrl).Enabled = status;
else if (ctrl is HyperLink)
((HyperLink)ctrl).Enabled = status;
}
コントロールにはEnabledプロパティがありますが、それぞれを大文字と小文字にする必要はありません。必要な型を配列に入れ、代わりに型をチェックできます。少し遅くなるかもしれませんが、保守性が向上します(操作するコントロールタイプを変更する必要がある場合)。 – Kieron
質問の要件は「タイプを取得する」ことでしたが、Enabledではそれが必要ではないことに同意しますが、特定のタイプに対して他のアクションを取る必要があるかもしれません。 – Glennular