我正在将一些纸质表单转换为网络表单,我的要求之一是拥有一组“是/否”复选框,如果未进行任何选择,它们也可以跟踪。因此,我不能只使用绑定(bind)到 Sql Server 中的位字段的单个 CheckBox,因为这不会跟踪用户是否忽略了该字段。
为了解决我的问题,我将两个复选框包装到 ASCX 控件中。然后我在 ASCX 控件中创建了一个公共(public) Checked 属性。如果选中了 true 复选框,则从该属性中我返回“True”;如果选中了 false 复选框,则返回“False”;如果没有选中两个复选框,则返回空字符串。
当我将此控件放入 GridView 中并使用 GridView SqlDataSource 将其绑定(bind)到位字段时,一切正常。当我在 FormView 中绑定(bind)相同的控件时,尽管 FormView 的更新将未触及的控件设置为 False。我单步执行了控制逻辑,它正确地传递了空字符串,因此 FormView 似乎在将值发送到存储过程之前覆盖了该值。
有没有办法让这个在 FormView 中工作,或者我是否必须重构以使用 int 字段之类的东西来跟踪三个选项:0=无选择、1=true、2=false 或其他像那样?我在下面提供了 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" />
最佳答案
您是否考虑过使用 nullable types ?
然后,您可以拥有更简单的代码,并且它可以更好地与数据库匹配,因为 SQL Server 具有可为空的位类型。像这样的东西应该有效:
public bool? Checked {get; private set;}
public void setChecked(String value)
{
if (value == "")
_checked = null;
else if (value.ToLower() == "true")
_checked = true;
else
_checked = false;
}
根据您所说的错误没有发生的位置以及上面的代码,我敢打赌您从字符串转换为整数以插入数据库时存在一些问题。同样,切换到上述代码应该可以解决该问题。
关于c# - 自定义控件的绑定(bind)在 GridView 中有效,但在 FormView 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592130/