2011-07-04 17 views
0

私はサイトを持っています(asp.netでビルドしています)。実行時にテキストや画像を追加したいのですが)。
ユーザーがパラメータを選択した後、彼は(.csファイルのファイルに)次のコードを呼び出すボタンをクリック:実行時に.csファイルからasp .netフォームにコントロールを追加する

foreach (var car in cars) 
{ 
    Label lbl = new Label(); 
    form1.Controls.Add(lbl); 
    lbl.Text = car.name; 
    Image myImage = new Image(); 
    form1.Controls.Add(myImage); 
    myImage.ImageUrl = car.imageURL; 

} 

が、私は、コードを実行すると、私はページ上のコントロールが表示されません。 私に何かが不足していますか?
ありがとうございます!

+0

ページのライフサイクルのどの時点で、そのコードを実行していますか? –

+0

ポストバックイベント処理段階。 – menacheb

答えて

0

あなたはcontフォームのプロパティを設定する前にフォームに移動してください。例えば

foreach (var car in cars){ 
    Label lbl = new Label(); 
    form1.Controls.Add(lbl); // Create and immediately assign 

    lbl.Text = car.name; // now you can set some properties 

    Image myImage = new Image(); 
    form1.Controls.Add(myImage); // Ditto 

    myImage.ImageUrl = car.imageURL; 
} 

UPDATE:

私はただそれだけのボタンを持っていたページを持つブランドの新しいWebアプリケーションプロジェクトを作成しました。それは期待どおりに働いた。他に何か起こっていることをお勧めします。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> 

    </div> 
    </form> 
</body> 
</html> 

と背後にあるコード:下記を参照してください

namespace WebApplication1 { 
    public partial class _Default : System.Web.UI.Page { 
     protected void Page_Load(object sender, EventArgs e) { 

     } 

     protected void Button1_Click(object sender, EventArgs e) { 
      for (Int32 i = 0; i < 10; i++) { 
       Label lbl = new Label(); 
       form1.Controls.Add(lbl); 
       lbl.Text = "HAHAHAHAH"; 
      } 
     } 
    } 
} 
+0

これを試しましたが、それでも動作しません。 – menacheb

+0

これは当てはまりません。コントロールを追加します。両方のリテラルコントロールで動作する私のサンプルを見てください。 – M4N

+0

@ M4N:実際それは本当です。コントロールが階層に追加されるまで、Viewstateは変更の追跡を開始しません。そのため、階層に追加する前にカスタム値(テキストなど)を設定すると、再構成時にviewstateが変更したことを検出できなくなります。この例では、それは重要ではありません。しかし、テキストボックスなどの場合はそれができます。これを動的に作成し、多くのテキストボックスとドロップダウンを追加しました。新しいコントロールをコンテナに関連付けた後でプロパティの割り当てを行うまで、何も正しく機能しませんでした。 – NotMe

0

フォームにプレースホルダコントロールを追加してみてください。 Form1.Controls.Add(....)を呼び出すのではなく、PlaceHolder1.Controls.Add(.....)を使用します。

+0

助けてくれない... – menacheb

+0

@menacheb、プレースホルダ1のコンセプトはうまくいくはずです。私たちは実行時にユーザーコントロールを読み込んでプレースホルダーに追加するために何度も使用しました – kobe

0

Webフォームで動的コントロールを作成する場合、コントロールを作成して追加する必要がありますコントロールコレクションはOnInitまたはPage_Loadイベントのいずれかにあります。

問題を解決するには、this questionを参照してください。

0

あなたはAndyPeacockの言うことを試してみることができますが、私はあなたが調査する必要があると思いますあなたのコードを見て実際にリピーターやDataListViewのような他のデータバインドされたコントロールです。

ここでは、リピーターでこれを実装する方法の簡単な例です:

あなたのASPXファイルで:

<asp:Repeater ID="RepCars" runat="server"> 
    <ItemTemplate> 
     <%# Eval("name") %> 
     <img src='<% Eval("imageURL") %>' alt="" /> 
    </ItemTemplate> 
</asp:Repeater> 

そして、あなたの.CS部に、おそらくをPage_Loadで:

RepCarImages.DataSource = cars; 
    RepCarImages.DataBind(); 

見てくださいhttp://www.w3schools.com/ASPNET/aspnet_repeater.asp

0

ない答えをするが、以下の削ぎ落としたサンプルは、私の作品:

<%@ Page Language="C#" AutoEventWireup="true" %> 
<html> 
<head runat="server"></head> 
<body> 
    <form id="form1" runat="server"> 

     <script runat="server"> 
     protected void Button1_Click(object sender, EventArgs e) 
     { 
      var lit = new Literal(); 
      Controls.Add(lit); 
      Controls.Add(new Literal() { Text = "aaaa" }); 
      lit.Text = "some text -- "; 
     } 
     </script> 

    <asp:Button ID="Button1" runat="server" Text="Button" 
     onclick="Button1_Click" /> 
    </form> 
</body> 
</html> 

だから、あなたが持っていないようですあなたの質問に答えるのに十分な情報を投稿しましたか?

関連する問題