2010-01-29 26 views
6

Tôi có mã này trong một lớp học kinh doanh.Ràng buộc DropDownList vào ListItemCollection và Giá trị không được thêm vào DDL

internal ListItemCollection GetAllAgents() 
    { 
     DataTable table = dao.GetAllAgents(); 
     ListItemCollection list = new ListItemCollection(); 

     foreach (DataRow row in table.Rows) 
     { 
      list.Add(new ListItem(row["agent_name"].ToString(), row["id"].ToString())); 
     } 
     return list; 
    } 

Tôi lấy lại bàn từ dao mà không gặp vấn đề gì. Tôi xem văn bản và đánh giá cao tính chất cư đúng cách (+1 cho một số illiteration tuyệt vời?) Và trở về trình bày và tôi ràng buộc như thế này

Helper helper = new Helper(); 
ListItemCollection agentList = helper.GetAllAgents(); 
agentList.Insert(0,""); 
this.ddlAgent.DataSource = agentList; 
this.ddlAgent.DataBind(); 

khi tôi thực hiện được giá trị chọn

this.ddlAgent.SelectedValue 

tôi hy vọng sẽ thấy id tác nhân, nhưng nội dung tôi nhận được là văn bản (tên tác nhân), vì vậy tôi đã thử điều này

this.ddlAgent.SelectedItem.Value 

nhưng tôi có cùng kết quả. Sau đó, tôi đã xem xét nguồn html đang được tạo và có vẻ như đây là

<select name="ctl00$ContentPlaceHolder1$ddlAgent" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$ddlAgent\',\'\')', 0)" id="ctl00_ContentPlaceHolder1_ddlAgent"> 
     <option selected="selected" value=""></option> 
     <option value="agent1_name">agent1_name</option> 
     <option value="agent2_name">agent2_name</option> 

mẫu này tiếp tục cho tất cả các tác nhân. Tôi hy vọng tôi chỉ làm một cái gì đó xương đầu và bạn có thể tất cả snicker khi bạn giải quyết vấn đề của tôi :)

Cảm ơn các bạn.

EDIT: nếu tôi làm điều đó như thế này

ListItemCollection agentList = helper.GetAllAgents(); 
agentList.Insert(0,""); 
foreach (ListItem agent in agentList) 
{ 
    this.ddlAgent.Items.Add(agent); 
} 

nó hoạt động tốt.

Trả lời

15

Hãy thử thực hiện:

this.ddlAgent.DataTextField = "Text"; 
this.ddlAgent.DataValueField = "Value"; 
this.ddlAgent.DataSource = agentList; 
this.ddlAgent.DataBind(); 

cũng nên làm việc, và nó có thể là tốt hơn so với Looping qua danh sách không có lý do.

Cập nhật Tìm thấy khác (ngắn hơn) cách để làm điều này:

this.ddlAgent.Items.AddRange(agentList.ToArray()); 
this.ddlAgent.DataBind(); 

Bằng cách sử dụng Items.AddRange() thay vì thiết lập các nguồn với DataSource, ASP có thể hình dung ra rằng nó nên sử dụng TextValue tính .

+0

đó là vé ... Tôi tự hỏi tại sao họ lại làm theo cách này? – jim

+0

Bạn cần chỉ định trường nào DropDownList sử dụng làm văn bản và giá trị. Nó trông giống như nó sẽ được thực hiện tự động (với các tham số để tạo ra một ListItem mới cũng được gọi là giá trị và văn bản) nhưng nó phải được rõ ràng. – Farinha

+0

cảm ơn bạn đã xóa bí ẩn – jim

6

Nếu agentList là một ListItemCollection mã sau hoạt động cho tôi, mà không gọi this.ddlAgent.DataBind();

this.ddlAgent.Items.AddRange(agentList.Cast<ListItem>().ToArray()) ; 
Các vấn đề liên quan