- PR -

ページ上のコントロール取得方法について

1
投稿者投稿内容
とも
会議室デビュー日: 2002/09/19
投稿数: 4
投稿日時: 2002-12-02 21:29
初めてスレ立てます。
VB.NETでのWebアプリでTextBoxのBorderColorやBorderStyleを変えて、
必須入力項目や、任意入力項目の判別を行う予定です。
# 社内APなので、ブラウザはIE6.0のみ対象です。

ユーザに見た目を相談する際にサンプルがあるといいだろうということで、
・適当なレイアウトでTextBoxをaspx上に配置。(必須、任意はIDで判別。)
・その下にDropDownListを4つ(必須、任意それぞれにBorderStyle、BoderColorのDropDownList)を配置。
・ボタン押下で選択されたDropDownListの内容をTextBoxのスタイルに反映。
というサンプルを作りたいと考えております。

が、配置されたWebコントロールの取得ができないのです。
画面上のWebコントロールを一括して取得する方法を
ご存知の方いらっしゃいましたら御教示下さい。
# 個々のTextBoxをベタ書きで指定すればできるけど、美しくないので。。。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2002-12-03 09:32
全コントロールの ID と型を出力する例です。
(ID が、ないコントロールは、括弧付きで ClientID を出しています)
コード:
string ShowControl(ControlCollection cc, int k, string h)
{
  string u, s = "", t = (h == null ? "" : h + "-");
  foreach (Control c in cc) 
  {
    u = t + (k++).ToString() + " ";
    s += u + (c.ID == null ? "(" + c.ClientID + ")" : c.ID) + "  [" 
      + c.ToString().Replace("System.Web.UI.","") + "]<br>";
    if (c.HasControls()) s += ShowControl(c.Controls,0,u);
  }
  return s;
}
void Page_Load(object sender, EventArgs e)
{
  if (IsPostBack) return;
  Response.Write(ShowControl(Controls,0,null));
}


出力例
引用:

0 (_ctl0) [ResourceBasedLiteralControl]
1 Form1 [HtmlControls.HtmlForm]
1 -0 (_ctl1) [LiteralControl]
1 -1 dg [WebControls.DataGrid]
...略
1 -1 -0 -5 -5 -0 (dg__ctl6__ctl2) [WebControls.DataGridLinkButton]


このとき、最後の LinkButton は、(1-1-0-5-5-0)を使って以下のようにアクセスできます。
(1-1 の ID が dg なので、2行目のようにも書いた方が簡単)
コード:
  ((LinkButton)Controls[1].Controls[1].Controls[0].Controls[5].Controls[5].Controls[0]).Text = "OK?";
  ((LinkButton)dg.Controls[0].Controls[5].Controls[5].Controls[0]).Text = "OK!";


とも
会議室デビュー日: 2002/09/19
投稿数: 4
投稿日時: 2002-12-03 14:19
catsさん、有難う御座いました。
お蔭様で、綺麗な形で実装ができました。
aspxの勉強にもなりました。

C#は初めて触ったのでてこずりましたが(^^);
とも
会議室デビュー日: 2002/09/19
投稿数: 4
投稿日時: 2002-12-03 23:13
参考までにVB.NETで書いたコードです。
# C#のほうがシンプルにかけるのか、私のスキルの問題か。。。

あと、追加で質問なのですがWebページのbgColorも動的に変更させたいと考えております。
簡単にできるだろうと後回しにしていたら、Pageに該当プロパティがないんで。。。
ご存知の方、いらっしゃいましたら助けてください。

コード:
Private Sub ShowControls(ByVal colCtl As ControlCollection, ByVal h As String)
        Dim ctl As Control
        Dim strTemp As String
        Dim strId As String
        Dim strSeq As String
        Dim strSeq1 As String
        Dim iTemp As Integer

        If h.Length = 0 Then
            strSeq = ""
        Else
            strSeq = h + "-"
        End If

        For Each ctl In colCtl
            If Not ctl.ID Is Nothing Then
                strId = ctl.ID
            Else
                'サーバIDが設定されていない場合は()付きでクライアントIDを表示
                strId = "(" + ctl.ClientID + ")"
            End If
            strSeq1 = strSeq + Convert.ToString(iTemp)
            'Typeについては[]付きで表示。
            strTemp = strSeq1 + vbTab + strId + vbTab + "[" + ctl.GetType.ToString + "]"
            Response.Write(strTemp & "<BR>")
            If ctl.HasControls Then
                ShowControls(ctl.Controls, strSeq1)
            End If
            iTemp = iTemp + 1
        Next
    End Sub

cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2002-12-05 11:44
ページ内のコントロール一覧ですが、trace属性をtrueにするだけで確認できますね。

コード:
<%@ page language="C#" trace="true" %>


1

スキルアップ/キャリアアップ(JOB@IT)