web-dev-qa-db-ja.com

Eval( "bitValue")をBoolとしてキャストする

ItemTemplate内にHyperLinkコントロールを含むリストビューがあります。戻り値が0(false)の場合はリンクを表示し、1(true)の場合はリンクを表示したくない。

これまでのところ私はこれを持っています:

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

...しかし、これは「指定されたキャストは無効です」という例外をレンダリングします。

私が他の場所で見た例は、これがうまくいくはずだと示唆しています。 Locked列が0または1(SQL Serverから)のみを返すことを確認できます-確かに、これらはビット/整数からブールに簡単にキャストする必要がありますか?

12
CJM

Lockedがintの場合は、次のようにする必要があります。

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

しかし、これも機能するはずなので、Locked> 0の場合はtrueを返します

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

Lockedには0または1が含まれていると言われていても、それはstill[〜#〜] int [〜#〜]であり、何らかの理由で1より大きい値を含む可能性があります。 。したがって、== 0ではなく== 1でチェックを行うことをお勧めします。 Lockedが何に使用されるかはわかりません。将来、Lockedに1より大きい値を含めることができるように設計が変更される可能性があります。

21
Jeroen

SQLは、ビットが0、1、およびnullの3つの状態を持つことができる奇妙な世界です。つまり、Eval("Locked")はnull許容型のboolであり、プレーンなboolではありません。ビット値がnullの場合、boolへのキャストは無効になります。最初に確認する必要があります。

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

これは、nullをfalseにマップする必要があることを前提としています。

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