2

我有一个 SQL 存储过程,我在其中基于其他两个列动态创建一个列(“Certified”)。此列的值为“0”或“1”。SQL 存储过程查询是:

, CASE WHEN 
    (StartMiles < EndMiles) 
    AND (StartTime < EndTime) 
    AND (bcd.Status != 'C')
     THEN '1' ELSE '0' END
     AS Certified

在我的 aspx 页面的前端,我有一个 Telerik radgrid,它将显示一个复选框(如果值为 1,则启用,如果值为 0,则禁用)。aspx 代码是:

<telerik:GridTemplateColumn DataField="Certified" HeaderText="Certified" Visible="true">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" 
        OnCheckedChanged="CheckBox2_CheckedChanged" 
        Enabled='<%# !bool.Parse(Eval("Certified").ToString()) %>' />
    </ItemTemplate>
</telerik:GridTemplateColumn>  

我在 aspx 页面上收到错误字符串未被识别为有效的布尔值
要解决该错误,如何在存储过程中设置数据类型?

4

2 回答 2

4
<telerik:GridTemplateColumn DataField="Certified" HeaderText="Certified" Visible="true">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" 
            OnCheckedChanged="CheckBox2_CheckedChanged" 
            Enabled='<%# !Convert.ToBoolean(Convert.ToInt32(Eval("Certified").ToString())) %>' />
    </ItemTemplate>
</telerik:GridTemplateColumn>
于 2013-11-14T15:17:46.713 回答
1

我建议使用代码隐藏方法来执行此操作,而不是通过嵌入式代码块将逻辑放入标记中,如下所示:

标记:

<telerik:GridTemplateColumn DataField="Certified" HeaderText="Certified" 
                            Visible="true">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" 
                    OnCheckedChanged="CheckBox2_CheckedChanged" 
                    Enabled='<%# IsCertified(Eval("Certified").ToString()) %>' />
    </ItemTemplate>
</telerik:GridTemplateColumn> 

代码隐藏:

protected bool IsCertified(string certifiedValue)
{
    return !bool.Parse(certifiedValue);
}

注意:为了更安全,我建议使用该Boolean.TryParse()方法而不仅仅是Parse(),因为这将消除无法解析为 a 的字符串bool引发异常的可能性。阅读Boolean.TryParse 方法文档以获取更多信息。

在我看来,与 OP 代码相比,这提供了两个优势:

  1. 简化标记,因为您在标记中没有条件逻辑,而现在只是对方法的调用。
  2. 您可以利用 Visual Studio 的 IntelliSense 编译器的强大功能在编译时而不是在运行时和调试器本身捕获语法错误。
于 2013-11-14T15:18:33.593 回答