我将一些纸质表单转换为Web表单,我的一个要求是有一个Yes/No组的复选框,如果没有选择,也可以跟踪。所以我不能只使用绑定到Sql Server中的一个位字段的CheckBox,因为它不会跟踪用户是否忽略了该字段。自定义控件的绑定工作在GridView中但不在FormView中
为了解决我的问题,我将两个复选框包装到一个ASCX控件中。然后我在ASCX控件中创建了一个公共Checked属性。从这个属性中,如果选中了真正的复选框,则返回“True”,如果复选框没有被选中,则“False”为false复选框,并且为空字符串。
当我把这个控件放在一个GridView中,并使用GridView的SqlDataSource将它绑定到一个位域时,所有东西都完美地工作。当我在FormView中绑定相同的控件时,尽管FormView的更新将未触摸的控件设置为False。我跨过了我的控制逻辑,它正确地传递了空字符串,所以看起来FormView在将值发送到存储过程之前会覆盖该值。
有没有办法让这个工作在FormView中,或者我将不得不重构使用类似int字段的东西来跟踪三个选项:0 =没有选择,1 =真,2 =假或类似的东西?我已经提供了我的ASCX控件的代码以供参考。
public partial class controls_yesNoCheck : System.Web.UI.UserControl
{
public string Checked
{
get
{
if (ckbNo.Checked)
return "false";
if (ckbYes.Checked)
return "true";
else
return "";
}
set
{
if (value == "")
{
ckbNo.Checked = false;
ckbYes.Checked = false;
}
else if (value == "True" || value == "true")
{
ckbYes.Checked = true;
ckbNo.Checked = false;
}
else
{
ckbNo.Checked = true;
ckbYes.Checked = false;
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void noChecked(object sender, EventArgs e)
{
ckbYes.Checked = false;
}
protected void yesChecked(object sender, EventArgs e)
{
ckbNo.Checked = false;
}
}
编辑: 控制的前端看起来是这样,我离开了CheckChanged方法了以前的代码块的,因为它们的功能不会影响此问题。
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="yesNoCheck.ascx.cs" Inherits="controls_yesNoCheck" %>
<asp:CheckBox ID="ckbYes" runat="server" Text="Yes" AutoPostBack="true" OnCheckedChanged="yesChecked" />
<asp:CheckBox ID="ckbNo" runat="server" Text="No" AutoPostBack="true" OnCheckedChanged="noChecked" />
您是否尝试过使用可空的布尔类型(bool?)。这将给出三个选项,然后您可以检查hasvalue是否将位列设置为DBNull。 – 2012-03-06 21:33:50
@JonRaynor - 我尝试了可空的bool类型,并从数据库中读取NULL值并发送给我的控件,如上所示,站点崩溃。 – 2012-03-07 16:28:36
当读取数据时,您需要一些代码来检查数据库中的值是否为空,例如if(record [“YesNoFlag”] == DBNull.Value then //将可为空的类型设置为不具有值。 .. – 2012-03-07 18:58:58