【问题标题】:Casting Eval("bitValue") as Bool将 Eval("bitValue") 转换为 Bool
【发布时间】:2010-08-11 17:38:40
【问题描述】:

我在 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) - 当然这些应该很容易从 bit/int 转换为 bool??

【问题讨论】:

    标签: c# asp.net sql-server casting eval


    【解决方案1】:

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

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

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

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

    无论提到 Locked 包含 0 还是 1。它 仍然是一个 INT,由于某种原因可能包含 > 1 的值。因此我认为这是一个很好的做法检查== 0 而不是== 1。我们不知道Locked 的用途是什么,并且将来设计可能会发生变化,以便Locked 可以包含大于1 的值。

    【讨论】:

    • ((int)Eval("Locked")) == 1 就足够了。
    • 我可以发誓我真的试过这个。令人困惑的部分是该字段实际上有点,因此不能> 1,因此我希望能够将其转换为布尔值。尽管如此,将其视为 int 是可行的,这很重要!谢谢。
    • @leppie - ((int)Eval("Locked"))!=! - 似乎没有人发现,逻辑被颠倒了......但重点...... :)
    • 这个解决方案对我不起作用。为什么它似乎对其他人有效?我无法确定操作是否以数据库中的 int 或位开头。我从一点开始。
    • 这最终成为我的解决方案的样子:&lt;%# ((bool)Eval("default")) == false %&gt;
    【解决方案2】:

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

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

    这假定 null 应该映射为 false。

    【讨论】:

    • 你确定吗?如果没有空值(由 OP 确认),将 bool? 转换为 bool 应该没有问题。
    • 忘记空值的问题,您的解决方案将无法正常工作,因为它不允许由于某种未知原因将位转换为布尔值...
    【解决方案3】:
    Checked='<%# Eval("SEND_EMAIL") == DBNull.Value ? false : Convert.ToBoolean(Eval("SEND_EMAIL")) %>'  
    

    【讨论】:

    • 这是唯一对我有帮助的方法,非常感谢!
    • 是的,如果使用 null 而不是 DBNull.Value 也会出现异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2015-04-17
    • 2017-02-24
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多