将Eval("bitValue")转换为Bool

CJM*_*CJM 12 c# sql-server asp.net casting eval

我在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 %>' />
Run Code Online (Sandbox Code Playgroud)

...但这会导致"指定的强制转换无效"异常.

我在其他地方看到的例子,这应该有效.我可以确认Locked列只返回0或1(来自SQL Server) - 当然这些应该很容易从bit/int转换为bool?

Jer*_*oen 21

如果Locked是一个int,你应该这样做:

<%# ((int)Eval("Locked")) == 1 ? true : false %>
Run Code Online (Sandbox Code Playgroud)

但是这也应该工作,所以当Locked> 0时它返回true

<%# !((int)Eval("Locked") == 0) %>
Run Code Online (Sandbox Code Playgroud)

无论提到Locked包含0还是1.它仍然是一个INT,它可以由于某种原因包含值> 1.因此我发现做检查的好习惯== 0而不是== 1.我们不知道Locked用于什么以及将来设计可能会改变,因此Locked可以包含值> 1.

  • `((int)Eval("Locked"))== 1`就足够了. (6认同)

Gno*_*omo 11

SQL是一个奇怪的世界,其中位可以有三个状态0,1和null!所以这意味着它Eval("Locked")是一个可以为空的类型bool,而不是一个普通的bool如果位值为null,则转换为bool将无效,您必须先检查:

(Eval("Locked")!=null && (bool)Eval("Locked")==true)
Run Code Online (Sandbox Code Playgroud)

这假设null应该映射为false.


小智 6

Checked='<%# Eval("SEND_EMAIL") == DBNull.Value ? false : Convert.ToBoolean(Eval("SEND_EMAIL")) %>'  
Run Code Online (Sandbox Code Playgroud)