c# - 自定义控件的绑定(bind)在 GridView 中有效,但在 FormView 中无效

标签 c# asp.net .net sql-server formview

我正在将一些纸质表单转换为网络表单,我的要求之一是拥有一组“是/否”复选框,如果未进行任何选择,它们也可以跟踪。因此,我不能只使用绑定(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/

相关文章:

c# - .NET WebBrowser 控件中的 HtmlDocument.InvokeScript 问题

c# - 这是在类中访问 session 的正确方法吗

c# - 带 IoC 的工厂隔离模式

asp.net - 在后面的代码中编写查询与 SqlDataSource

java - Web 服务自定义绑定(bind) - 签署 SOAP header 和消息,但不加密

C# - 当每个 'row' 有多个值时对列表进行排序?

.net - 如何缓存css,图像和js?

c# - 可选参数必须是引用类型、可为 null 的类型,或者声明为可选

c# - WebBrowser 打印设置

c# - Specflow/Gherkin 测试 XML 文档