2009-01-03 24 views
10

có cách nào để làm cho thuộc tính datatextfield của danh sách thả xuống trong asp.net thông qua C# bao gồm nhiều hơn một thuộc tính của một đối tượng không?danh sách thả xuống DataTextField được tạo từ các thuộc tính?

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string FunkyValue { get; set; } 
    public int Zip { get; set; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    List<MyObject> myList = getObjects(); 
    ddList.DataSource = myList; 
    ddList.DataValueField = "Id"; 
    ddList.DataTextField = "Name"; 
    ddList.DataBind(); 
} 

Tôi muốn ví dụ: không sử dụng "Tên", nhưng "Tên (Zip)" ví dụ.

Chắc chắn, tôi có thể thay đổi Lớp MyObject, nhưng tôi không muốn làm điều này (vì lớp MyObject nằm trong lớp mô hình và không nên làm điều gì đó tôi cần trong giao diện người dùng).

Trả lời

22

Thêm tài sản khác đến lớp MyObject và ràng buộc đối với tài sản đó:

public string DisplayValue 
{ 
get { return string.Format("{0} ({1})", Name, Zip); } 
} 

Hoặc nếu bạn không thể sửa đổi MyObject, tạo ra một đối tượng wrapper trong lớp trình bày (chỉ cho hiển thị). Đây cũng có thể được thực hiện bằng một số LINQ:

List<MyObject> myList = getObjects(); 
ddList.DataSource = (from obj in myList 
        select new 
        { 
         Id = obj.Id, 
         Name = string.Format("{0} ({1})", obj.Name, obj.Zip) 
        }).ToList(); 
ddList.DataValueField = "Id"; 
ddList.DataTextField = "Name"; 
ddList.DataBind(); 

(xin lỗi tôi không có Visual Studio sẵn, do đó có thể có sai sót trong code)

4

tôi sẽ khuyên bạn nên đọc này: http://martinfowler.com/eaaDev/PresentationModel.html

Về cơ bản bạn muốn tạo một lớp đại diện cho ràng buộc với một giao diện người dùng cụ thể. Vì vậy, bạn sẽ ánh xạ Model của bạn (My Object trong ví dụ của bạn) đến một đối tượng ViewModel, và sau đó liên kết danh sách thả xuống theo cách đó. Đó là một cách hay để suy nghĩ về việc chia tách mối quan tâm.

EDIT: Dưới đây là một loạt blog trên ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

+0

cảm ơn bạn, đây là gợi ý hữu ích để có kiến ​​trúc tốt hơn, nhưng bạn đã hiểu câu hỏi của tôi một cách hoàn hảo. :) – karlis

2

BTW, Hãy thử gán "DataTextField" và "DataValueField" trước khi bạn gán DataSource. Làm như vậy sẽ ngăn chặn sự kiện "SelectedIndexChanged" trong khi dữ liệu ...

Các vấn đề liên quan