繁体   English   中英

复选框拒绝绑定数据

[英]Checkbox refused to bind data

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

我收到了很多错误:无效的类型转换,字符串格式无效等。

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

Mon_S1是布尔值(真,假)。 更改为字符串以测试以下代码段。

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显示数据。

以下跟踪错误的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>

堆栈跟踪:

[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

在此处输入图片说明

不要使用aspx和所有的Eval方法苦苦挣扎,而可以使用codebehind完成这些方法,而是使用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<bool>更改为row.Field<string> 代码隐藏的好处是您具有编译时安全性和调试能力。

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

由于其他原因,我也宁愿不使用前端作为我的业务逻辑。

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

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

为什么不传递布尔值?

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

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

DataTable["Checked"] = true 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM