复选框拒绝绑定数据
Checkbox refused to bind data
当数据加载到 gridview 时,布尔值应该显示在复选框中。复选框应为可编辑格式。
我遇到了很多错误:无效的转换、字符串的格式无效等。
我在 Google 和这里也进行了搜索。有许多开发人员面临相同或相似的问题并设法解决了它。
Mon_S1
是布尔值(真、假)。更改为字符串以测试以下代码片段。
- 1 : changed the values in db to be string and gives : System.FormatException: String was not recognized as a valid Boolean. and - 3 : same issue
checked='<%# bool.Parse(Eval("Mon_S1").ToString()) %>'
checked='<%# Eval("Mon_S1") %>'
- 4 : this shows an empty editable checkbox
checked='<%# Eval("Mon_S1").ToString().Equals("1") %>'
checked='<%# Bind("Mon_S1").ToString().Equals("1") %>'
但无论我尝试了什么样的答案组合,它都不会根据实际上具有布尔值的数据库显示数据。
以下转换错误的堆栈跟踪:
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
方法,您可以使用代码隐藏完成,而是使用 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");
}
}
更新:因为根据你的评论它似乎可以为空,所以使用这个:
bool? nullOrTrue = row.Field<bool?>("Mon_S1");
chk.Checked = nullOrTrue.HasValue && nullOrTrue.Value;
如果它实际上不是 bool
而是 string
,请将 row.Field<bool>
更改为 row.Field<string>
。代码隐藏的好处是你有编译时安全和调试能力。
因此,即使这也给您带来异常,您也可以轻松修复它。您只需要在第一行设置一个断点,并期望调试器的快速监视中的值 window。在那里您可以找出实际涉及的类型。也许 e.Row.DataItem
不是 DataRowView
,然后在调试器中查看它并使用正确的类型。
我也不想为我的业务逻辑使用前端 for other reasons。
而不是在 asp.net 端使用 .toString() 和 .Equals("1");
Checked='<%# Eval("Mon_S1").ToString().Equals("1") %>'
为什么不传递布尔值?
Checked='<%# Eval("Checked") %>'
通过在数据表或数据源中添加一个带有 bool 的列
DataTable["Checked"] = true
如果您需要绑定到网格视图。
当数据加载到 gridview 时,布尔值应该显示在复选框中。复选框应为可编辑格式。
我遇到了很多错误:无效的转换、字符串的格式无效等。
我在 Google 和这里也进行了搜索。有许多开发人员面临相同或相似的问题并设法解决了它。
Mon_S1
是布尔值(真、假)。更改为字符串以测试以下代码片段。
- 1 : changed the values in db to be string and gives : System.FormatException: String was not recognized as a valid Boolean. and - 3 : same issue
checked='<%# bool.Parse(Eval("Mon_S1").ToString()) %>'
checked='<%# Eval("Mon_S1") %>'
- 4 : this shows an empty editable checkbox
checked='<%# Eval("Mon_S1").ToString().Equals("1") %>'
checked='<%# Bind("Mon_S1").ToString().Equals("1") %>'
但无论我尝试了什么样的答案组合,它都不会根据实际上具有布尔值的数据库显示数据。
以下转换错误的堆栈跟踪:
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
方法,您可以使用代码隐藏完成,而是使用 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");
}
}
更新:因为根据你的评论它似乎可以为空,所以使用这个:
bool? nullOrTrue = row.Field<bool?>("Mon_S1");
chk.Checked = nullOrTrue.HasValue && nullOrTrue.Value;
如果它实际上不是 bool
而是 string
,请将 row.Field<bool>
更改为 row.Field<string>
。代码隐藏的好处是你有编译时安全和调试能力。
因此,即使这也给您带来异常,您也可以轻松修复它。您只需要在第一行设置一个断点,并期望调试器的快速监视中的值 window。在那里您可以找出实际涉及的类型。也许 e.Row.DataItem
不是 DataRowView
,然后在调试器中查看它并使用正确的类型。
我也不想为我的业务逻辑使用前端 for other reasons。
而不是在 asp.net 端使用 .toString() 和 .Equals("1");
Checked='<%# Eval("Mon_S1").ToString().Equals("1") %>'
为什么不传递布尔值?
Checked='<%# Eval("Checked") %>'
通过在数据表或数据源中添加一个带有 bool 的列
DataTable["Checked"] = true
如果您需要绑定到网格视图。