【问题标题】:Checkbox refused to bind data复选框拒绝绑定数据
【发布时间】:2015-07-22 23:59:46
【问题描述】:

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

我收到很多错误:无效转换、字符串格式无效等。

我在 Google 和这里​​也进行了搜索。有许多开发人员面临相同或类似的问题并设法解决了问题。

Mon_S1 是一个布尔值(真,假)。更改为字符串以测试以下代码 sn-ps。

checked='<%# bool.Parse(Eval("Mon_S1").ToString()) %>'

checked='<%# Eval("Mon_S1") %>'

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

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

以下转换错误的堆栈跟踪:

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>

堆栈跟踪:

[InvalidCastException: Specified cast is not valid.]
   ASP.testschedule_aspx.__DataBinding__control38(Object sender, EventArgs e) in C:\Test - 0509 working\TestSchedule.aspx:145
   System.Web.UI.Control.OnDataBinding(EventArgs e) +92
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +85
   System.Web.UI.Control.DataBind() +15
   System.Web.UI.Control.DataBindChildren() +187
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +94
   System.Web.UI.Control.DataBind() +15
   System.Web.UI.Control.DataBindChildren() +187
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +94
   System.Web.UI.Control.DataBind() +15
   System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource) +167
   System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +3724
   System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) +67
   System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) +14
   System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +123
   System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +33
   System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
   System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
   System.Web.UI.WebControls.GridView.DataBind() +4
   TestSchedule.TestSchedule.BindGridViewDataSchedule() in C:\Test - 0509 working\TestSchedule.aspx:39
   TestSchedule.TestSchedule.Page_Load(Object sender, EventArgs e) in C:\Test - 0509 working\TestSchedule.aspx.cs:22
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
   System.Web.UI.Control.OnLoad(EventArgs e) +92
   System.Web.UI.Control.LoadRecursive() +54
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

【问题讨论】:

  • 与其提及所有错误,不如提及哪种方法引发了哪些异常。
  • 我正在编辑@TimSchmelter
  • 并将您的异常消息和堆栈跟踪显示为文本。
  • 属性Mon_S1的类型是什么?
  • 如果 Mon_S1 不是布尔类型,您将收到强制转换错误

标签: c# asp.net checkbox


【解决方案1】:

不要继续使用 aspx 和所有 Eval 方法,您可以使用代码隐藏来完成,而是使用 GridViewRowDataBound-event:

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");
    }
}

更新:根据您的评论,它似乎可以为空,请使用:

bool? nullOrTrue = row.Field<bool?>("Mon_S1");
chk.Checked = nullOrTrue.HasValue && nullOrTrue.Value;

如果它实际上不是bool,而是string,请将row.Field&lt;bool&gt; 更改为row.Field&lt;string&gt;。代码隐藏的好处是您具有编译时安全性和调试能力。

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

我也不想将前端用于我的业务逻辑for other reasons

【讨论】:

  • 我现在正在尝试这个。我不想使用后面的代码的原因是因为这个gridview中有大量的复选框。这是给员工的时间表。所以他们可以选中/取消选中它。根据特定组的员工数量,一次可以有 100 多个复选框加载到 gridview 中。我个人不喜欢使用 gridview,但我不熟悉使用 ajax 或其他 html 的东西来完成这项工作。
  • 我在chk.Checked = row.Field&lt;bool&gt;("Mon_S1"); 收到相同的转换错误当更改为字符串时,代码当然有错误,因为 Mon_S1 数据是布尔值。
  • @aspiring:然后使用row.Field&lt;string&gt;("Mon_S1")=="1"row["Mon_S1"].ToString()=="1"row.Field&lt;string&gt;("Mon_S1")=="true"。检查调试器中的值,它显示了什么?也许您应该将数据库的列更改为使用bit 而不是string
  • 我正在尝试处理 null,因为现在有一个新错误。 System.InvalidCastException: Cannot cast DBNull.Value to type 'System.Boolean'. Please use a nullable type.
  • 如果它是一个可以为空的布尔值,请使用bool? nullOrTrue = row.Field&lt;bool?&gt;("Mon_S1")。编辑了我的答案。
【解决方案2】:

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

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

为什么要传递一个布尔值?

Checked='<%# Eval("Checked") %>'

通过在数据表或数据源中添加带有布尔值的列

DataTable["Checked"] = true 

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

【讨论】:

  • Stacktrace 出现此错误:Checked='&lt;%# Eval("Mon_S1") %&gt; 其中Mon_S1 是布尔值...
  • 你确定你的 Mon_S1 是布尔类型吗?,用 typeof(Boolean) 更好的数据列
  • 当你声明DataTable时,你可以通过dt.columns.add(new DataColumn("Checked",typeof(Boolean));定义DataColumn变量类型
  • 你最后的评论很有道理。所以我给你做了标记。我正在尝试缩小确切的错误范围。
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2011-02-09
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多