1

動的に作成されるテキストボックスがいくつかあります -

int i = 1;
while (reader.Read())
{
    System.Web.UI.WebControls.TextBox textBox = new System.Web.UI.WebControls.TextBox();
    textBox.ID = reader["field_id"].ToString();
    textBox.Enabled = false;
    HtmlGenericControl div = new HtmlGenericControl("div");

    if(i%2 != 0)
        div.Attributes.Add("style", "margin-right:120px;padding-bottom:20px;");

    if (i % 2 == 0)
        div.Attributes.Add("style", "padding-bottom:20px;");

    div.Attributes.Add("class", "inline fourcol");
    div.InnerHtml = "<label>" + reader["field"] + "</label>"; 
    div.Controls.Add(textBox);
    panelId.Controls.Add(div);
    textBox.Text = reader["field_value"].ToString();
    ++i;
}

それはうまくいきます(少なくとも私は確信しています-彼らはどうあるべきかを示します)。しかし、それらをループして有効にするか、値を取得しようとすると、「型 'System.Web.UI.LiteralControl' のオブジェクトを型 'System.Web.UI.WebControls.TextBox' にキャストできません。 " エラー。

これは私がそれをやろうとしてきた方法です -

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (System.Web.UI.WebControls.TextBox t in panel.Controls)
    {
        t.Enabled = true;
    }
}

ありがとう!

4

6 に答える 6

4

をループしています。panel.Controlsこれは、パネル内のすべてのコントロールをループします。これは、追加したすべてのものをループすることと必ずしも同じではありません。開始時に存在していたパネル内に別のものがあった場合は、それも取得することになります。

おそらくあなたが望んでいたのはこれでした:

foreach (var t in panel.Controls.OfType<System.Web.UI.WebControls.TextBox>())
{
    t.Enabled = true;
}
于 2012-11-27T16:54:37.957 に答える
3

各テキストボックスを「div」コントロール内に配置HtmlGenericControlしてから、パネルコントロール内に配置します。HtmlGenericControlだからまずは中身を探さなきゃpanelId.Controls

あなたを助けるかもしれないサンプルコード:

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (Control c in panelId.Controls)
            {
                if (c is HtmlGenericControl)
                {
                    foreach (var textbox in c.Controls.OfType<TextBox>()) //ofType returns IEnumerable<TextBox>
                        textbox.Enabled = true;
                }
            }
} 
于 2012-11-27T18:35:37.537 に答える
1

内にコントロールがありPanel、それは ではなく、TextBoxそれにキャストできませんでした。ループの前にブレークポイントを配置しpanel.Control、デバッグ モードでコレクションの内容を確認する必要があります。

foreachループで型を指定せず、安全なキャストを自分で行うと、この問題を回避できます。

foreach (var t in panel.Controls)
{
    var textbox = t as System.Web.UI.WebControls.TextBox;
    if(textbox != null)
    {               
        textbox.Enabled = true;
    }
}
于 2012-11-27T16:51:13.447 に答える
0

コレクションには、TextBox だけでなく、パネル内のすべてのコントロールのControlsコレクションが含まれます。すべてのコントロールを反復処理し、as演算子を使用して型キャストを実行できます。型キャストが成功した場合は、テキスト ボックスを有効にすることができます。

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (var control t in panel.Controls)
    {
        System.Web.UI.WebControls.TextBox textBox = control as System.Web.UI.WebControls.TextBox;
        if (textBox != null)
        {
            control.Enabled = true;
        }    
    }
}
于 2012-11-27T16:59:15.210 に答える
0

テキストボックスを div 要素に追加し、div 要素をパネルに追加します。したがって、パネルでコントロールを選択してから、テキストボックスを見つける必要があります。

foreach (var t in panel.Controls.Cast<Control>().SelectMany(c => c.Controls))
{
    if (t is TextBox == false) continue;

    ((TextBox)t).Enabled = true;
}
于 2012-11-27T16:53:54.847 に答える
0

コントロールが TextBox かどうかを確認する必要があります

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (var t in panel.Controls)
    {
        if (t is System.Web.UI.WebControls.TextBox)
            ((System.Web.UI.WebControls.TextBox)t).Enabled = true;
    }
}
于 2012-11-27T16:51:29.900 に答える