2012-01-04 10 views
1

コードビハインドの代わりにページにドロップダウンアイテムを追加することは可能でしょうか?コードビハインドの代わりにページにループしてドロップダウンアイテムを追加しますか?

は、だから私は、私は1900年〜現在の年表示するドロップダウンボックスを持っていると言う

<asp:DropDownList ID="ddlYear" runat="server" CssClass="text"> 
    <% 
     int currentYear = DateTime.Now.Year; 
     for (int i = 1900; i < currentYear; i++) 
     { 
    %> 
     <asp:ListItem><%=i %></asp:ListItem> 
    <% 
     } 
    %> 
</asp:DropDownList> 

それはそのような何かを行うことは可能ですか?

私はそれが私を与える上のように実行しようとするときので:編集

Warning 1 C:\SandBox\MyWebApplication1\MyWebApplication1\Default.aspx: ASP.NET runtime error: Code blocks are not supported in this context. C:\SandBox\MyWebApplication1\MyWebApplication1\Default.aspx 35 1 MyWebApplication1

:私も試してみました:

<asp:DropDownList ID="DropDownList1" runat="server"> 

</asp:DropDownList> 

<% 
    int currentYear = DateTime.Now.Year; 

    if (currentYear <= 1933) 
    { 
     currentYear = 2012; 
    } 
    for (int i = 1933; i < currentYear; i++) 
    { 
     DropDownList1.Items.Add(new ListItem(i.ToString(), i.ToString())); 
    } 
%> 

しかしとき表示DropDownListコントロールがアイテムを持っていません...

===== 編集:Splash-Xが提案したように、レンダリングされましたが、ポストバック後にすべてのアイテムが消えました....

<form id="form1" runat="server"> 
<div> 
<% 
    int currentYear = DateTime.Now.Year; 
    if (!Page.IsPostBack) 
    { 
     if (currentYear <= 1933) 
     { 
      currentYear = 2012; 
     } 
     DropDownList1.Items.Clear(); 
     for (int i = 1933; i < currentYear; i++) 
     { 
      DropDownList1.Items.Add(new ListItem(i.ToString(), i.ToString())); 
     } 
    } 
%> 
<asp:DropDownList ID="DropDownList1" runat="server"> 

</asp:DropDownList> 



    <input id="Button1" type="button" value="button" onclick="MyFunction();"/> 
    <div id="MyDiv"> 
    </div> 
    <asp:Button ID="Button2" runat="server" Text="Button" /> 
</div> 
</form> 
+1

ASP.NETにはこの目的のためのリピータコントロールがありませんか? – mbeckish

+0

私はちょうどリピータのコントロールをチェックアウトしましたが、それは少し過度のようですね?私はDropDownItemを追加する必要があります.... –

答えて

0

私は、ASP.NET 2.0で書かれたプロジェクトを持っていて、ソースコードを変更することはできませんでした。ドロップダウンに表示されていた状態を変更する必要がありました。古いコードは米国の州とカナダの州があり、私たちは州だけを表示する必要がありました。ドロップダウンはコード内のデータソースにバインドされていたので、項目をクリアしてからすべての項目を追加しました。

<% 
if(!IsPostBack) 
{ 
    st.Items.Clear(); 
    st.Items.Add(new ListItem("State", "")); //Add an empty item at the top for default value   
    string usStates = "AA,AE,AK,AL,AP,AR,AS,AZ,CA,CO,CT,DC,DE,FL,FM,GA,GU,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MH,MI,MN,MO,MP,MS,MT,NC,ND,NE,NH,NJ,NM,NV,NY,OH,OK,OR,PA,PR,PW,RI,SC,SD,TN,TX,UT,VA,VI,VT,WA,WI,WV,WY"; 
    foreach (string state in usStates.Split(',')) 
    { 
     st.Items.Add(new ListItem(state, state)); 
    } 
} 
%> 
<select name="st" class="col" id="st" alt="select" runat="server"> 

違いは、私が制御前の人の変更をやっているし、それがページに出てレンダリングされた後、私はこれをしなければならなかった理由は、コントロールの後に来る任意のスクリプトがドロップダウンを変更されています。

コードをドロップダウンリストの上に移動してみてください。私たちのコードは、過去に入力された値を保存できるようにポストバックがあるかどうかをチェックします。各ページの読み込み時にリストをリロードする必要はありません。

+0

oうわーは仕事ですが、変わっています...ポストバックの後で私のアイテムはすべて消えてしまいました... –

+0

コードにドロップダウンの項目を変更しているものがありますか?その理由は、コントロール(およびアイテム)がレンダリングされた後から、コントロール(およびアイテム)がページにレンダリングされる前にコードを移動したためです。 –

+0

私はあなたがコントロールの前に項目を追加するスクリプトを動かすと言ったことをしました。しかし、私が行ったPostBackを行うボタンをクリックすると。 –

1

私はそれが信じられません。コードブロックではなくページ内にスクリプトブロックを置くことができますが、コードブロックと同じ方法でコードブロックを作成することができます(つまり、メソッドブロックとオブジェクトとしてドロップダウンを参照してaddメソッドを呼び出すなど)。このページでそれを行うことで、実際に何かを得ているわけではありません。

+0

私はちょうどcode-behideからUI stuffをsepereatesしたいので、code-behideにはロジックが含まれています.... –

+0

私はあなたがやっていることは論理だと主張します。いずれにせよ、もしあなたが本当にこの種のものを他のロジックとは別にしたいのであれば、コードビハインドクラスに異なる領域を持たせることも、部分的なクラスを使ってコードビハインドに2つの異なるファイルを持たせることもできます。 – Chris

+0

より良いアプローチは、ドロップダウンリストである独自のカスタムユーザーコントロールを作成し、その中のすべてのロジックを実行し、そのコントロールを使用することです。本当の間違った答えはありませんが、いくつかの答えはより理にかなってより構造化されたアプローチに従うかもしれません。 –