2010-08-11 27 views
8

Tôi có chế độ xem danh sách với điều khiển HyperLink trong ItemTemplate. Tôi muốn hiển thị liên kết nếu giá trị trả về là 0 (sai) và không hiển thị liên kết nếu nó là 1 (đúng).Casting Eval ("bitValue") là Bool

Cho đến nay tôi có điều này:

<asp:HyperLink runat="server" ID="lnkReview" 
    NavigateUrl='<%# Eval("EnquiryID", @"selectcompany.aspx?enq={0}")%>' 
    Text="Review Enquiry" 
    Visible='<%# ((bool)Eval("Locked"))==true? false : true %>' /> 

... nhưng điều này làm cho một 'diễn viên chỉ định không có giá trị' ngoại lệ.

Ví dụ tôi đã thấy ở những nơi khác, việc này sẽ hoạt động. Tôi có thể xác nhận rằng các cột bị khóa chỉ trả về 0 hoặc 1 (từ SQL Server) - chắc chắn những nên được dễ dàng đúc từ bit/int để bool ??

Trả lời

16

Nếu bị khoá là một int bạn nên làm điều này:

<%# ((int)Eval("Locked")) == 1 ? true : false %> 

Nhưng sau đó điều này nên làm việc quá, vì vậy nó trả về true khi bị khoá> 0

<%# !((int)Eval("Locked") == 0) %> 

Không có vấn đề nó được đề cập rằng đã bị khoá chứa 0 hoặc 1. Đó là vẫn là một INT vì lý do nào đó có chứa các giá trị> 1. Do đó, tôi thấy thực tiễn tốt để thực hiện kiểm tra trên == 0 thay vì == 1. Chúng tôi không biết những gì Locked được sử dụng cho và trong tương lai thiết kế có thể thay đổi để Locked có thể chứa một giá trị> 1.

+5

'((int) Eval (" Locked ")) == 1' là đủ. – leppie

+0

Tôi có thể thề tôi thực sự đã thử điều này. Phần khó hiểu là trường thực sự là một chút và do đó không thể là> 1, do đó tôi mong đợi để có thể đưa nó vào bool. Tuy nhiên, coi nó như một công trình int, và đó là điều quan trọng! Cảm ơn. – CJM

+0

@leppie - '((int) Eval (" Locked "))! =!' - không ai có vẻ bị phát hiện, logic đã bị đảo ngược ... nhưng điểm lấy .. :) – CJM

10

SQL là một thế giới kỳ lạ nơi bit có thể có ba trạng thái 0, 1 và null! Vì vậy, điều này có nghĩa rằng Eval("Locked") là một loại bool nullable, không phải là một bool đồng bằng Một dàn diễn viên để bool sẽ không có giá trị nếu giá trị bit là null, bạn phải kiểm tra xem đầu tiên:

(Eval("Locked")!=null && (bool)Eval("Locked")==true) 

này giả định rằng rỗng nên được ánh xạ tới sai.

+0

Bạn có chắc chắn không? Sẽ không có vấn đề gì khi tạo một 'bool?' Thành 'bool' nếu không có giá trị null (như được xác nhận bởi OP). – Gabe

+0

Ồ! Tôi bỏ lỡ xác nhận rằng không có giá trị null ... – Gnomo

+0

Quên vấn đề về giá trị null, giải pháp của bạn sẽ không hoạt động vì nó sẽ không cho phép một chút để được đúc như một bool cho một số lý do không rõ ... – CJM

6
Checked='<%# Eval("SEND_EMAIL") == DBNull.Value ? false : Convert.ToBoolean(Eval("SEND_EMAIL")) %>' 
+0

Điều này là phương pháp duy nhất đã giúp tôi, cảm ơn rất nhiều! –

+0

Yep cũng có ngoại lệ nếu sử dụng null thay vì DBNull.Value –