2012-01-25 45 views
5

Tóm tắtASP.NET WebForms DropDownList dữ liệu ràng buộc hành vi lạ?

tôi tải thành phố từ bối cảnh dữ liệu vào hai danh sách khác nhau và ràng buộc họ phải điều khiển DropDownList tương ứng của họ.

Mặc dù mã giống nhau cho cả hai và chỉ có dữ liệu và rõ ràng tên của các điều khiển khác nhau, việc ràng buộc dữ liệu dường như không hoạt động đúng cho chỉ một trong số chúng. Thay vì hiển thị tên thành phố, nó hiển thị Id của nó, đó là, chỉ cho tùy chọn đầu tiên!

Mã-đằng sau

Chúng tôi có hai điều khiển DropDownList:

  1. DestinationDropDownList;
  2. OriginDropDownList.

Sau đó, tôi điền chúng.

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" /> 

Datum hiển thị

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

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

Màn hình chính xác được hiển thị bởi điều khiển OriginDropDownList. Tại sao DestinationDropDownList không hiển thị chính xác dữ liệu, tức là, cho mục đầu tiên và duy nhất trong danh sách của nó? Tôi không hiểu chút nào và mất một vài giờ đã cố gắng tìm ra giải pháp! = (

  1. tôi đã cố gắng loại bỏ các mục đầu tiên trước khi chèn các hướng dẫn;
  2. tôi đã cố gắng để chèn các hướng dẫn hai lần, sau đó loại bỏ một trong những đầu tiên;
  3. Tôi cố gắng để đi cùng với phương pháp DropDownList.Items.Add(string), và này được hiển thị không có gì như đối với hàng đầu tiên, thay vào đó là các Guid trống.

Câu hỏi

  1. Đã từng gặp sự cố như vậy với kiểm soát DropDownList chưa?
  2. Cách sửa lỗi này !?

EDIT # 1

michielvoo 's câu trả lời giúp tôi tìm thấy một phương pháp mới để ràng buộc dữ liệu hướng dẫn. Thông qua mã của mình, giải pháp được tìm thấy là:

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

xóa lệnh chèn chỉ trong mã cho chỉ DropDownList này. Bây giờ nó hiển thị chính xác những gì tôi muốn ngay từ đầu.

Tôi chấp nhận câu trả lời của mình vì đó là người đã dẫn tôi đến một giải pháp tốt. Tôi không cảm thấy nó là giải pháp thực sự, nhưng miễn là kết quả là của họ, tôi không quan tâm nhiều. Ngoài việc xác minh Guid.Empty để xác thực trang, tôi sẽ phải kiểm tra chỉ dẫn của mình và vô hiệu hóa trang khi người dùng không chọn thành phố nằm ở một chỉ mục khác 0, kể từ khi tôi kiểm tra với Guid sẽ thất bại.

EDIT # 2

Với mã-đằng sau tuyên bố trong câu trả lời michielvoo, nó hoàn toàn giải quyết được vấn đề tôi đã cho DropDownList hiển thị ListItem.Value tài sản thay vì ListITem.Text tài sản duy nhất và chỉ dành cho mục đầu tiên trong danh sách. Tôi không biết có gì sai với những cách khác, nhưng cái này hoạt động rất tốt!

Cảm ơn michielvoo!

Cảm ơn tất cả vì sự hỗ trợ của các bạn! =)

+0

Tôi không thể tái tạo vấn đề này ... – JonH

+0

JonH: Tôi hơi vui khi bạn không thể, bởi vì nó là một nỗi đau khi nó xảy ra! ;) Cảm ơn vì hạt muối của bạn! =) –

+0

Tôi không thể hiểu tại sao điều này lại xảy ra với bạn ... – JonH

Trả lời

7

Tôi chưa gặp vấn đề này trước đây, nhưng tôi sẽ cố gắng trả lời câu hỏi thứ hai của bạn. Tôi thấy ít giá trị trong việc thêm mục 'hướng dẫn' đầu tiên thông qua mã (sửa tôi nếu tôi sai). Tôi muốn thêm nó trực tiếp đến mark-up:

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

Mục đầu tiên sẽ tồn tại trong dữ liệu ràng buộc do việc sử dụng các thuộc tính AppendDataBoundItems. Tôi cũng đã thêm các thuộc tính DataTextFieldDataValueField, bạn cũng có thể xóa các thuộc tính đó khỏi mã.

Một điều bạn có thể làm trước khi dữ liệu ràng buộc, được chiếu các đối tượng để ListItem trường hợp:

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

Bằng cách này, bạn không cần phải thiết lập các DataTextField hoặc DataValueField tài sản trên sự kiểm soát như bạn đã tự tạo các mục của danh sách.

+0

Tôi không biết về điều đó! Hãy để tôi thử nó và xem điều gì xảy ra. =) Cảm ơn! –

+0

+1 để dạy tôi một cách mà tôi không biết. - Thêm 'ListItem' đầu tiên khi bạn làm việc tốt, vì tôi có thể thấy mục ngay cả sau khi ràng buộc dữ liệu xảy ra. Tuy nhiên, chỉ cho mục đầu tiên, nó là giá trị của nó được hiển thị, vì vậy tôi sẽ tiếp tục nhìn thấy giá trị 'Guid.Empty'. Có vẻ như nó chỉ thực hiện điều này với mục đầu tiên trong danh sách, vì tôi có thể thấy chỉ dẫn của tôi từ lệnh mà tôi đã chèn vào trong mã. –

+0

Đối với quan điểm của tôi để làm cho nó thông qua mã, nó chỉ vì đây là cách để làm điều đó trong Windows Forms. Tôi là người mới bắt đầu phát triển Web, vì vậy tôi chưa thực sự quen thuộc với các thẻ và thuộc tính HTML và ASP.NET này. Tôi thà thấy mã C#, tôi cảm thấy rằng nó cho phép tôi kiểm soát tốt hơn các điều khiển và những gì xảy ra trong trang trong tổng thể. =) –