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