2012-10-09 29 views
-1

我讀過的這幾個不同的例子,這似乎是對那些不完全瞭解asp.net頁面生命週期明確的新手問題,對不起還在學習。我的任何修復嘗試都沒有完成。得到錯誤的值在下拉列表中後面的代碼

ASPX:

... 
<% 
for(int j = 0; j < 11; j++) 
{ 
    ChildWeightPounds.Items.Add(new ListItem(j.ToString(),j.ToString())); 
} 
%> 
<asp:DropDownList ID="ChildWeightPounds" runat="server" OnSelectedIndexChanged="DropDownListSelected"> 
    <asp:ListItem Value="">-Select-</asp:ListItem> 
</asp:DropDownList> 
... 
<asp:Button ID="InsertButton" runat="server" Text="Submit" OnClick="InsertButton_Click" /> 

aspx.cs:

protected void InsertButton_Click(object sender, EventArgs e) 
{ 
    foreach (Control c in NewPatientForm.Controls) 
    { 
     .... 
     if (c is TextBox) 
     { 
      TextBox tb = (TextBox)c; 
      //Expected response: 
      Response.Write("field: " + tb.ID + " = " + tb.Text + "<br />"); 
     } 
     if (c is DropDownList) 
     { 
      DropDownList ddl = (DropDownList)c; 

      //Unexpected response: 
      //this is not giving me my selected value, but only the top item ("--select--") 
      Response.Write("field: " + ddl.ID + ", selectedItem: " + ddl.SelectedItem.Value + "<br />"); 
     } 
    } 
} 

,很明顯這是一個的IsPostBack,的DataBind(),問題與我缺乏的頁面生命週期的理解。但是沒有意義的是,我遍歷所有控件,並且文本框,複選框,複選框列表都正常工作,並給我在該字段中的值,出於某種原因,下拉列表不會給我提供值。

我使用OnSelectedIndexChanged事件試過,我已經使用的DataBind()函數嘗試過,但這些玩,還沒有得到我的價值。

回答

1

你的榜樣最大的問題是您使用內聯C#你的頁面中有<% %>。對於asp.net,建議不要這樣做。這是更多的傳統/傳統ASP方法,由於許多原因,.NET不能很好地發揮作用。

嘗試移動代碼,將標記文件中的項目添加到dropdownlist到.cs文件中,並確保掛鉤到發生在OnPreRender之前或之前的頁面事件。這是您可以更改頁面控件並使視圖狀態/生命週期正常工作的最後一點。

protected void Page_Load(object sender, EventArgs e) 
{ 
    for(int j = 0; j < 11; j++) 
    { 
     ChildWeightPounds.Items.Add(new ListItem(j.ToString(),j.ToString())); 
    } 
} 

很可能不運行的例子,該值被插入到dropdownlistlifecycle不正確的時間,正因爲如此,當你嘗試在代碼中訪問所選背後的價值是它不工作。

考慮在asp.net lifecycle下面的文章可以幫助您。

+0

金!就是這個。謝謝!不幸的是把for循環放在.cs文件中看起來不太乾淨。 E.I.我有一堆字段(textfields,checkboxes,dropdowsn等),每個字段都被構建並顯示在.aspx文件中。一些DropDownLists包含很好的重複模式,因此使用<% for()...%>直接添加內聯項是有意義的。在後面的代碼中構建DropDownLists項目隨機出現。有沒有一個乾淨的方式來做到這一點,這也給我我期望的價值?再次感謝! – russds

+0

@russds很高興幫助。如果您不喜歡asp.net中的代碼和標記分離概念,那麼您將面臨艱辛的戰鬥。它基本上是創始原則之一。如果你來自ASP背景,我可以看到它是如何「不同」的,但最終(根據我對兩者的經驗),毫無疑問,這個概念在分離方面效果更好。把它看作一個文件定義頁面上的內容,另一個文件定義它是如何工作的。 –

+0

@russds如果你喜歡用你的標記定義功能,你可能想看看ASP.NET MVC(模型視圖控制器)。可能會更適合你的風格。 –

0

您可以在自己的DropDownList調整AutoPostBack="true",並定義OnSelecIndexChanged event

<asp:DropDownList ID="ChildWeightPounds" runat="server" 
     OnSelectedIndexChanged="DropDownListSelected" AutoPostBack="true> 
     <asp:ListItem Value="">-Select-</asp:ListItem> 
    </asp:DropDownList> 

代碼隱藏

void DropDownListSelected(Object sender, EventArgs e) 
{ 
var value = ChildWeightPounds.SelectedValue; 
} 
+0

謝謝你,其實我不喜歡添加的AutoPostBack =「true」可以降下來,因爲這將刷新頁面(至少從我的理解),我有領域的一個長長的清單,並會要求用戶再次向下滾動並搜索他們在表單上的位置。 – russds

+0

我很高興幫助你俄羅斯 –