C# 复选框拒绝绑定数据

C# 复选框拒绝绑定数据,c#,asp.net,checkbox,C#,Asp.net,Checkbox,将数据加载到gridview时,布尔值应显示在复选框中。复选框应为可编辑格式 我收到了大量错误:无效的强制转换,字符串格式无效等 我在谷歌和这里搜索过。有许多开发人员面临相同或类似的问题,并设法解决了这些问题 Mon_S1是一个布尔值(true,false)。更改为字符串以测试以下代码段 及- checked='' checked='' checked='' checked='' 但无论我尝试了哪种答案组合,它都不会按照db显示数据,而db实际上具有布尔值 针对以下强制转换错误的

将数据加载到gridview时,布尔值应显示在复选框中。复选框应为可编辑格式

我收到了大量错误:无效的强制转换,字符串格式无效等

我在谷歌和这里搜索过。有许多开发人员面临相同或类似的问题,并设法解决了这些问题

Mon_S1
是一个布尔值(true,false)。更改为字符串以测试以下代码段

  • 及-
checked=''

checked=''

checked=''
checked=''

但无论我尝试了哪种答案组合,它都不会按照db显示数据,而db实际上具有布尔值

针对以下强制转换错误的Stacktrace:

Line 143:        <asp:TemplateField HeaderText="MS1">
Line 144:            <ItemTemplate>
Line 145:                <asp:CheckBox ID="cbMS1" runat="server" checked='<%# Eval("Mon_S1") %>'/>
Line 146:            </ItemTemplate>
Line 147:        </asp:TemplateField>

不要继续使用aspx和所有使用codebehind可能已经完成的
Eval
方法,使用
GridView
RowDataBound
-事件:

protected void gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        CheckBox chk = (CheckBox) e.Row.FindControl("cbMs1");
        DataRow row = ((DataRowView)e.Row.DataItem).Row;
        chk.Checked = row.Field<bool>("Mon_S1");
    }
}
受保护的无效gridview1\u行数据绑定(对象发送方,GridViewRowEventArgs e)
{
如果(e.Row.RowType==DataControlRowType.DataRow)
{
复选框chk=(复选框)e.Row.FindControl(“cbMs1”);
DataRow row=((DataRowView)e.row.DataItem).row;
chk.Checked=行字段(“Mon_S1”);
}
}
更新:根据您的评论,它似乎可以为空,请使用以下命令:

bool? nullOrTrue = row.Field<bool?>("Mon_S1");
chk.Checked = nullOrTrue.HasValue && nullOrTrue.Value;
bool?nullOrTrue=行字段(“Mon_S1”);
chk.Checked=nullOrTrue.HasValue&&nullOrTrue.Value;
如果它实际上不是一个
bool
而是一个
string
则将
row.Field
更改为
row.Field
。codebehind的好处是您具有编译时安全性和调试能力

因此,即使这也会给您一个异常,您也可以轻松地修复它。您只需要在第一行设置一个断点,并在调试器的“快速监视”窗口中预期值。在那里,您可以了解实际涉及的类型。可能
e.Row.DataItem
不是
DataRowView
,然后在调试器中查看它并使用正确的类型

我也不喜欢在我的业务逻辑中使用前端。

而不是在asp.net端使用.toString()和.Equals(“1”)

Checked='<%# Eval("Mon_S1").ToString().Equals("1") %>'

如果您需要绑定到网格视图。

不要提及所有错误,而应该提及哪种方法导致了什么异常。我正在编辑@Timschmelter并将异常消息和堆栈跟踪显示为文本。Mon_S1属性的类型是什么?如果Mon_S1不是布尔类型,您将得到cast error我正在尝试。我不想使用代码隐藏的原因是因为这个gridview中有大量的复选框。这是员工的日程表。这样他们就可以选中/取消选中它。根据特定组的员工数量,gridview中一次可以加载100多个复选框。我个人不喜欢使用gridview,但我不熟悉使用ajax或其他html来完成这项工作。我在
chk.Checked=row.Field(“Mon_S1”)收到了相同的强制转换错误更改为字符串时,当然代码有错误,因为Mon\u S1数据是bool。@抱负:然后使用
row.Field(“Mon\u S1”)=“1”
row[“Mon\u S1”]”。ToString()=“1”
row.Field(“Mon\u S1”)=“true”
。检查调试器中的值,它显示了什么?也许您应该将数据库中的列更改为使用
bit
而不是
string
。我正在尝试处理null,因为现在有一个新错误<代码>System.InvalidCastException:无法将DBNull.Value强制转换为类型“System.Boolean”。请使用可空类型。
如果是可空bool,请使用
bool?nullOrTrue=row.Field(“Mon_S1”)
。编辑了我的答案。Stacktrace出现此错误:
Checked='
其中
Mon\u S1
是一个布尔值…你确定你的Mon\u S1是布尔型的吗?当你声明
DataTable
时,让typeof(boolean)的datacolumn更好。你可以通过
dt.columns.add(new datacolumn)定义
datacolumn
变量类型(“Checked”,typeof(Boolean));
你的最后一条评论很有意义。所以我给你打了标记。我试图缩小到准确的错误范围。
Checked='<%# Eval("Mon_S1").ToString().Equals("1") %>'
Checked='<%# Eval("Checked") %>'
DataTable["Checked"] = true