2009-05-18 29 views
25

Có thể DataBind ASP.NET CheckBoxList sao cho giá trị chuỗi trong dữ liệu trở thành nhãn của hộp kiểm và giá trị bool kiểm tra/bỏ chọn hộp không?ASP.NET CheckBoxList DataBinding Câu hỏi

On Webform asp.net của tôi Tôi có một CheckBoxList như thế này:

<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" /> 

Trong đoạn mã đằng sau tôi có mã này:

var usersInRole = new List<UserInRole> 
{ 
    new UserInRole { UserName = "Frank", InRole = false}, 
    new UserInRole{UserName = "Linda", InRole = true}, 
    new UserInRole{UserName = "James", InRole = true}, 
}; 

chkListRoles.DataSource = usersInRole; 
chkListRoles.DataBind(); 

tôi đã kinda hy vọng rằng các hộp kiểm sẽ kiểm tra khi InRole = true. Tôi cũng đã thử InRole = "Checked". Kết quả là như nhau. Tôi dường như không thể tìm thấy một cách để DataBind và automagically có các hộp kiểm tra kiểm tra/bỏ chọn.

Hiện tại tôi giải quyết được sự cố bằng cách đặt được chọn = true cho các mục thích hợp trong sự kiện DataBound. Có vẻ như có một giải pháp sạch hơn ngoài tầm tay của tôi.

Cảm ơn bạn

+0

http://stackoverflow.com/questions/879434/asp-net-checkboxlist-databinding-question –

Trả lời

37

EDIT: Không có cách nào để thực hiện việc này thông qua Đánh dấu. DataValueField không xác định xem mục kiểm tra có được kiểm tra hay không. Nó truy xuất hoặc lưu trữ giá trị được sử dụng trong postback. Các DataValueField là phổ biến trên CheckBoxLists, RadioButtonLists, ListControl, vv

Đây là cách duy nhất để chọn trước các hộp kiểm như bạn đã phát hiện ra.

chkListRoles.DataSource = usersInRole; 
chkListRoles.DataBind(); 

foreach(ListItem item in chkListRoles.Items) 
item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole; 
+0

Cảm ơn Jose, câu trả lời của bạn làm rõ tình hình. –

+3

Cũng nhờ tôi José, tôi sẽ sử dụng lambda đó ;-) –

+2

Có vẻ như một thiếu sót lạ trong ASP.NET. Tại sao họ không có một thuộc tính DataCheckedField cũng? –

0

Tôi nghĩ bạn sẽ phải kiểm soát thuộc tính nào để liên kết nó với ... trong trường hợp này là "InRole".

Tôi đã chơi xung quanh với nó và có vẻ như đã có ngày nay để liên kết với việc chọn hộp kiểm, bạn phải tự làm. Tôi đã có thể liên kết với văn bản và giá trị của danh sách kiểm tra mà dường như chỉ xử lý nhãn của mỗi hộp kiểm trong danh sách.

+0

Trong tệp * .aspx tôi khai báo CheckBoxList với thuộc tính DataValueField = "InRole". Đó có phải là ý bạn không? –

+0

Đó là những gì tôi đã nói về ... Tôi đã không cuộn để xem bạn đã thiết lập điều đó trong mã UI ... xin lỗi. – CSharpAtl

+0

Sự kiện thường là giá trị được sử dụng để thực hiện thêm bất kỳ quá trình xử lý nào. – Younes

9

Tôi đã thực hiện kiểm soát tùy chỉnh cho điều này, sau khi bị mệt mỏi do ràng buộc OnItemDataBound. Nó sẽ cho phép bạn liên kết thuộc tính Selected. Bạn có thể dễ dàng thực hiện cùng một điều khiển cho RadioButtonList bằng cách thay đổi điều khiển tùy chỉnh xuất phát từ đó.

Để sử dụng, chỉ cần thêm thuộc tính DataCheckedField khi bạn tạo điều khiển trong đánh dấu của mình. Hãy nhớ tham chiếu đến các điều khiển tùy chỉnh trong tệp web.config của bạn.

Markup

<myControls:SimpleCheckBoxList runat="server" ID="chkListRoles" 
           DataCheckedField="InRole" 
           DataTextField="UserName" 
           DataValueField="UserId" /> 

Mã cho sự kiểm soát

public class SimpleCheckBoxList : System.Web.UI.WebControls.CheckBoxList 
{ 
    public string DataCheckedField 
    { 
     get 
     { 
      string s = (string)ViewState["DataCheckedField"]; 
      return (s == null) ? String.Empty : s; 
     } 
     set 
     { 
      ViewState["DataCheckedField"] = value; 
      if (Initialized) 
       OnDataPropertyChanged(); 
     } 
    } 

    protected override void PerformDataBinding(IEnumerable dataSource) 
    { 
     if (dataSource != null) 
     { 
      if (!this.AppendDataBoundItems) 
       this.Items.Clear(); 

      if (dataSource is ICollection) 
       this.Items.Capacity = (dataSource as ICollection).Count + this.Items.Count; 

      foreach (object dataItem in dataSource) 
      { 
       ListItem item = new ListItem() 
       { 
        Text = DataBinder.GetPropertyValue(dataItem, DataTextField).ToString(), 
        Value = DataBinder.GetPropertyValue(dataItem, DataValueField).ToString(), 
        Selected = (DataCheckedField.Length > 0) ? (bool)DataBinder.GetPropertyValue(dataItem, DataCheckedField) : false 
       }; 
       this.Items.Add(item); 
      } 
     } 
    } 
} 
+0

Có vẻ thú vị, nhưng 'dataSelectedField' hiển thị lỗi. Bất kỳ đề xuất? – MAW74656

+0

@ MAW74656 Hãy thử thay thế bằng 'dataCheckedField' để thay thế. Có vẻ như lỗi đánh máy cũ ba năm. Vui lòng cung cấp phản hồi về kết quả của bạn! – sshow

5

Nó không thể sử dụng đánh dấu. Những gì bạn có thể làm là kết buộc danh sách kiểm tra như bạn muốn nó hoạt động - với bool trong DataValueField, và sau đó chỉ cần thêm điều này như là sự kiện OnDataBound.

protected void myCheckBoxList_DataBound(object sender, EventArgs e) 
    { 
     foreach (ListItem item in myCheckBoxList.Items) 
     { 
      item.Selected = bool.Parse(item.Value); 
     } 
    } 

Sự khác biệt giữa giải pháp này và giải pháp do Jose Basilio đề xuất là phương pháp này hoạt động với tất cả các loại phương pháp dữ liệu.Ví dụ ràng buộc với một SelectMethod sử dụng tính năng ModelBinding mới trong v4.5.

+0

Có, giải pháp này hoạt động cho .NET v4.5 trong khi giải pháp trước đó không. – Jony