2010-05-26 35 views
15

Tôi đang cố nối hai trường từ một danh sách để hiển thị trong danh sách thả xuống. Dưới đây là mã tôi đang cố gắng sử dụng. Tôi không muốn thay đổi mô hình sản phẩm của mình vì vậy tôi đã cố gắng làm một cái gì đó như thế dưới đây nhưng tôi không thể tìm ra bất cứ thứ gì mà không xây dựng đối tượng của riêng mình với các trường được nối.Nối hai trường để hiển thị trong danh sách thả xuống

  skuDropDown.DataSource = List<product> 
      skuDropDown.DataTextField = "ProductId" // want to combine with"Description"; 
      skuDropDown.DataValueField = "ProductId"; 
      skuDropDown.DataBind(); 

Cảm ơn mọi ý tưởng sẽ hữu ích.

+0

Tôi e rằng bạn không có tùy chọn nào khác ngoài việc mở rộng miền –

Trả lời

26

Để gán nguồn với phương thức đã cho, tôi sẽ sử dụng LINQ để tạo một loại ẩn danh với các thuộc tính bạn muốn. Một cái gì đó như

List<Product> products = new List<Product>(); 
products.Add(new Product() { ProductId = 1, Description = "Foo" }); 
products.Add(new Product() { ProductId = 2, Description = "Bar" }); 

var productQuery = products.Select(p => new { ProductId = p.ProductId, DisplayText = p.ProductId.ToString() + " " + p.Description }); 

skuDropDown.DataSource = productQuery; 
skuDropDown.DataValueField = "ProductId"; 
skuDropDown.DataTextField = "DisplayText"; 
skuDropDown.DataBind(); 
+0

Cảm ơn, điều này đã làm việc thích một sự quyến rũ khi tôi. – Locke12

0

Tạo lớp mới mở rộng sản phẩm, truyền nội dung Danh sách làm lớp mở rộng, chứa một thuộc tính mới, trả về các giá trị được ghép nối của ProductID và Mô tả.

Tôi nghĩ rằng nên làm việc OTOMH.

Tôi biết rằng bạn không muốn thay đổi cấu trúc sản phẩm, đó là lý do tại sao tôi đề xuất tạo một lớp mở rộng. Nhưng afaik nó không thể mà không ràng buộc nó vào một lĩnh vực của đối tượng.

0

Thật không may, nếu bạn đang sử dụng databinding, DataTextField phải là tên của một trường trên nguồn dữ liệu của bạn.

Một điều bạn có thể làm là lặp lại các mục trong danh sách thả xuống sau khi bạn đã ràng buộc chúng và sửa đổi các thuộc tính Văn bản của chúng. Điều duy nhất cần làm là lấy trường nối được thêm vào đối tượng dữ liệu.

1

Bạn có thể làm điều này:

List<Product>.ForEach(
    x => skuDropDown.Items.Add(
    new Item(x.ProductId + " " x.ProductDescription, x.ProductId) 
); 

Chỉ cần lặp qua danh sách và thêm mỗi mục vào danh sách thả xuống. Đó là những gì .net sẽ làm cho bạn đằng sau hậu trường trong ví dụ của bạn.

0

Tất cả những gì bạn cần làm là ghi đè phương thức .ToString() của Sản phẩm.

public override string ToString() 
{ 
    return ProductID + " " + ProductDescription; 
} 

Sau đó, tất cả những gì bạn cần làm là liên kết với trình đơn thả xuống. Từ sự hiểu biết của tôi, các lab thả xuống ar gắn với chuỗi() của các đối tượng trong bộ sưu tập mà nó liên kết.

nói cách khác, làm điều này.

List<Product> products = new List<Product>();  
products.Add(new Product() { ProductId = 1, Description = "Foo" });  
products.Add(new Product() { ProductId = 2, Description = "Bar" });  

var productQuery = products.Select(p => new { ProductId = p.ProductId, DisplayText = p.ProductId.ToString() + " " + p.Description });  

skuDropDown.DataSource = productQuery;  
skuDropDown.DataBind(); 
4

NẾU bạn có một lớp đại diện cho một sản phẩm, chỉ cần tạo một tài sản mà mở rộng lớp học của bạn và gửi lại kết hợp, ví dụ:

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

và, trong danh sách thả xuống DataBind bạn tham khảo tài sản của bạn

skuDropDown.DataSource = productQuery;  
skuDropDown.DataValueField = "ProductId";  
skuDropDown.DataTextField = "ID_Description";  
skuDropDown.DataBind(); 
Các vấn đề liên quan