2012-01-25 60 views
5

摘要ASP.NET WebForms DropDownList數據綁定奇怪的行爲?

予加載從數據上下文城市成兩個不同的列表,並將它們結合到它們各自的DropDownList控件。

儘管兩者的代碼都是相同的,只有數據和控件的名稱顯然不同,但數據綁定似乎無法正常工作,只有其中一個。它不顯示城市名稱,而是顯示其ID,即僅顯示第一個選項!

代碼隱藏

我們有兩個DropDownList控件:

  1. DestinationDropDownList;
  2. OriginDropDownList

然後,我填充它們。

public partial class MyControl : UserControl { 
    protected void Page_Load(object sender, EventArgs e) { 
     if (!IsPostBack) { 
      var instruction = new City() { 
       CityId = Guid.Empty, 
       CityName = "- Select a city -" 
      }; 

      var destinations = context.Cities.ToList(); 
      destinations = destinations.OrderBy(c => c.CityName).ToList(); 
      destinations.Insert(0, instruction); 
      DestinationDropDownList.DataSource = destinations; 
      DestinationDropDownList.DataTextField = "CityName"; 
      DestinationDropDownList.DataValueField = "CityId"; 
      DestinationDropDownList.DataBind(); 

      var origins = context.Cities.ToList(); 
      origins = origins.OrderBy(c => c.CityName).ToList(); 
      origins.Insert(0, instruction); 
      OriginDropDownList.DataSource = origins; 
      OriginDropDownList.DataTextField = "CityName"; 
      OriginDropDownList.DataValueField = "CityId"; 
      OriginDropDownList.DataBind(); 
     } 
    } 
    private static readonly MyDataContext context = new MyDataContext(); 
} 

HTML

<asp:DropDownList ID="DestinationDropDownList" runat="server" /> 
<asp:DropDownList ID="OriginDropDownList" runat="server" /> 

基準顯示

*DestinationDropwDownList* 
    - 0000-0000-0000-0000-0000 (empty Guid) 
    - CityName 01 
    - CityName 02 
    - ... 

*OriginDropDownList* 
    - - Select a city - 
    - CityName 01 
    - CityName 02 
    - ... 

正確的顯示是由OriginDropDownList控件提供的顯示。爲什麼DestinationDropDownList不能正確顯示數據,也就是說,它的列表中的第一個也是唯一的第一個項目!?我一點都不明白,幾個小時已經試圖找到解決方案! =(

  1. 我試圖插入指令之前移除所述第一項;
  2. 我試圖插入指令兩次,然後除去第一之一;
  3. 我試圖與DropDownList.Items.Add(string)方法走,和這是什麼都不顯示作爲第一行,而不是空的Guid。

問題

  1. 有沒有人遇到過這樣的DropDownList控件問題?
  2. 如何糾正這種行爲!?

編輯#1

michielvoo的回答幫我找到數據綁定指令的新方法。通過他的代碼,找到的解決方法是這樣的:

<asp:DropDownList ID="DestinationDropDownList" runat="server" 
        AppendDataBoundItems="true" 
        CssClass="required"> 
    <asp:ListItem Value="- Select a city -" /> 
</asp:DropDownList> 

從代碼中刪除指令插入僅用於此DropDownList。現在它從頭開始顯示我想要的。

我接受了他的答案,因爲是他讓我找到了一個很好的解決方法。我不認爲這是真正的解決方案,但只要結果是他們的,我不介意。除此之外,我不必驗證Guid.Empty是否驗證頁面,我必須檢查我的指示,並且在用戶沒有選擇位於另一個索引的城市時,將頁面設置爲無效,因爲我的檢查是Guid將失敗。

編輯#2

隨着代碼隱藏在michielvoo的回答說,它完全解決了我曾經爲DropDownList問題顯示ListItem.Value財產,而不是ListITem.Text屬性僅供參考,只列表中的第一項。我不知道其他方面有什麼問題,但是這個方法非常棒!

謝謝michielvoo!

謝謝大家的支持! =)

+0

我不能重現這個問題... – JonH

+0

JonH:我有點高興你不能,因爲它發生時真的很痛! ;)謝謝你的一粒鹽! =) –

+0

我只是不能理解爲什麼發生在你身上...... – JonH

回答

7

我還沒有遇到過這個問題,但我會盡力回答你的第二個問題。我通過代碼添加第一個'教學'項目看不出什麼價值(糾正我,如果我錯了)。我寧願直接將它添加到加價:

<asp:DropDownList ID="DestinationDropwDownList" runat="server" 
    AppendDataBoundItems="true" 
    DataTextField="CityName" 
    DataTextField="CityId"> 
    <asp:ListItem Text="- Select a city -" /> 
</asp:DropDownList> 

的第一個項目將生存的數據,由於使用AppendDataBoundItems屬性的結合。我還添加了DataTextFieldDataValueField屬性,您也可以從代碼中刪除這些屬性。

可以數據綁定,在投影實體ListItem實例之前做的另一件事:

DestinationDropDownList.DataSource = 
    from d in destinations 
    select new ListItem() { 
    Text = d.CityName, 
    Value = d.CityId.ToString() 
    }; 
DestinationDropDownList.DataBind(); 

這樣,您就不必在控制設置DataTextFieldDataValueField屬性,你已經自己創建列表項目。

+0

我不知道那個!讓我試試看看會發生什麼。 =)謝謝! –

+0

+1教我的方式,我不知道。 - 如你所做的那樣添加第一個'ListItem'工作良好,因爲即使在數據綁定發生後我也能看到該項目。但是,僅對於第一項,它顯示的是它的值,所以我將繼續看到'Guid.Empty'值。它看起來像只在列表中的第一個項目時這樣做,因爲我可以從我在代碼中插入的項目中看到我的指令。 –

+0

至於我的觀點,通過代碼,這只是因爲這是在Windows窗體中執行它的方式。我是Web開發人員的初學者,所以我還沒有真正瞭解這些HTML和ASP.NET標記和屬性。我寧願看到C#代碼,我的印象是,它讓我更好地控制了控件,並在整個頁面中發生了什麼。 =) –

相關問題