2009-10-13 27 views
7

Tôi có một mẫu mục ListView sau đây, trong đó tôi đang cố ràng buộc giá trị số nguyên vào thuộc tính Checked của CheckBox.Số nguyên ràng buộc ASP.NET vào trường Kiểm tra của CheckBox

IsUploaded giá trị chỉ 0 và 1 chứa ...

<asp:ListView ID="trustListView" runat="server"> 
    <ItemTemplate> 
     <asp:CheckBox ID="isUploadedCheckBox" runat="server" 
      Checked='<%# Bind("IsUploaded") %>' /> 
    </ItemTemplate> 
</asp:ListView> 

Nhưng ASP.NET phàn nàn rằng

Ngoại lệ chi tiết: System.InvalidCastException: Sepcified dàn diễn viên không hợp lệ

Mặc dù mã sau đây sử dụng DataBinder.Eval() hoạt động,
Tôi nee d để có một ràng buộc 2 chiều, do đó cần phải sử dụng Bind().

<asp:CheckBox ID="isUploadedCheckBox2" runat="server" 
    Checked='<%# Convert.ToBoolean(
     DataBinder.Eval(Container.DataItem, "IsUploaded"))) %>' /> 

Làm thế nào tôi có thể chuyển đổi 0 và 1 để boolean sử dụng Bind()?


[ĐÁP] tôi đã mở rộng loại tự động tạo ra thông qua partial class bằng cách thêm một tài sản mới được đề cập trong answer by Justin

+0

Đang tạo "Đã tải lên" một chút hoặc kiểu dữ liệu boolean khác thay vì tùy chọn int? – kscott

+0

@kscott: "Đã tải lên" là một chút. – Sung

+0

Bạn đang ràng buộc loại nguồn dữ liệu nào? Ràng buộc một hộp kiểm đến một bit bằng cách sử dụng một objectdatasource trỏ đến một bộ điều hợp bảng làm việc không có lỗi cho tôi. – kscott

Trả lời

7

Nếu bạn sẵn sàng thay đổi của lớp, thêm một tài sản trên lớp đó là một boolean

public bool IsUploadedBoolean 
{ 
    get { return IsUploaded != 0; } 
    set { IsUploaded = value ? 1 : 0; } 
} 

Nếu không, bạn có thể thành công với một TypeConverter:

  1. Tạo một tùy chỉnh TypeConverter mà sẽ xử lý 0 và 1 để chuyển đổi boolean
  2. Stick TypeConverterAttribute trên tài sản IsUploaded chỉ đạo NET để typeconverter tùy chỉnh của bạn.
3

Làm thế nào về việc thêm một tài sản để lớp học của bạn mà không chuyển đổi?

public bool IsUploadedBool 
{ 
    get { return IsUploaded == 1; } 
} 

và sau đó liên kết với thuộc tính IsUploadedBool này thay vì trực tiếp đến INT bên dưới.

Marc

+0

@marc_s: Bạn có nghĩa là gấp đôi "==" không "=" :) – Sung

+0

Tôi đã làm - tất nhiên - cảm ơn! Cập nhật –

2

Kind của một tác phẩm cheesy xung quanh sẽ được sử dụng một danh sách thả với mục danh sách xuống để cho tác dụng tương tự:

<asp:DropDownList ID="ddlBool" runat="server" SelectedValue= '<%# Bind("IsUploaded") %>'> 
    <asp:ListItem Text="True" Value="1" /> 
    <asp:ListItem Text="False" Value="0" /> 
</asp:DropDownList> 
+0

Xin lỗi scott nhưng tôi phải dính vào "CheckBox" cho trường hợp cụ thể của tôi. Nhưng cảm ơn bạn đã cho tôi một cái nhìn sâu sắc về điều này. – Sung

+0

@kscott: Bạn có thể thay đổi câu trả lời của mình không? (thêm dấu chấm hoặc v.v.) để tôi có thể đưa ra câu trả lời của bạn? Tôi xem câu trả lời của bạn là một lựa chọn hợp lệ cho trường hợp của tôi. Cảm ơn. – Sung

1

Làm thế nào về (btw tôi đang sử dụng một thủ tục lưu trữ)

trang ASPX

<asp:CheckBox ID="social_facebook" runat="server" Checked='<%# Bind("True") %>' />Facebook 

Mã đằng sau

cmd.Parameters.Add("@p_facebook", SqlDbType.Bit).Value = social_facebook.Checked; 
0

Giải pháp:

Xin chào, tôi cũng đang sử dụng xếp hạng Ajax bên trong GridView và tôi gặp sự cố này. Sau khi xem qua một số diễn đàn, tôi đã thử điều này và nó đã làm việc cho tôi. Tôi hy vọng nó sẽ giúp bạn:

<%# Convert.ToInt32(Eval("EVALUATION")) %> 

trả về một số nguyên, vì bạn đang sử dụng Kiểm tra là số nguyên.

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