C# Web复选框未为函数提供值

C# Web复选框未为函数提供值,c#,asp.net,checkbox,web,components,C#,Asp.net,Checkbox,Web,Components,我有一个奇怪的问题,我似乎搞不懂。我为在服务器上运行的商业应用程序创建了一个web组件。如果我将cbxGramEnabled.Checked更改为True或False则函数运行正常并进行更改。但是,如果我将cbxGramEnabled.Checked保留为cbxGramEnabled,则该函数不会更新数据库 运行组件的代码如下所示: private void WriteToSQL( ) { WriteEnableGram( _pkKey, cbxGramEnabled.Checked);

我有一个奇怪的问题,我似乎搞不懂。我为在服务器上运行的商业应用程序创建了一个web组件。如果我将
cbxGramEnabled.Checked
更改为
True
False
则函数运行正常并进行更改。但是,如果我将
cbxGramEnabled.Checked保留为
cbxGramEnabled,则该函数不会更新数据库

运行组件的代码如下所示:

private void WriteToSQL( )
{
    WriteEnableGram( _pkKey, cbxGramEnabled.Checked);
}
cbxGramEnabled.Checked
是web应用程序自定义组件上的
复选框

private void WriteEnableGram( int nPKkey, bool bChecked)
{
    string szQuery = string.empty;

    if (bChecked == true)
        szQuery = "UPDATE dbo.CustomKeyAttr SET EnableGram = 1 WHERE pkCustomKeyAttr = " + nPKkey.ToString() + ";";
    else
        szQuery = "UPDATE dbo.CustomKeyAttr SET EnableGram = 0 WHERE pkCustomKeyAttr = " + nPKkey.ToString() + ";";


    try
    {
        string szConString = @"Data Source=.\sqlexpress;Initial Catalog=MetricDB;User ID=webuser;Password=mypass;"; 
        using (var Conn = new SqlConnection(szConString))
        {
            Conn.Open();
            using (SqlCommand dbQuery = new SqlCommand(szQuery, Conn))
            {
                dbQuery.ExecuteNonQuery();
            }
        }
    }
    catch (SqlException)
    {
    }
    catch (Exception)
    {
    }
    finally
    {
        cbxEnableGram.Text = szQuery; // at least display what the query is somewhere on the page....
    }
}

首先,让我们假设以下是正确的:

布尔值可以是
true
false
null
(未分配)

复选框的
checked
属性可以具有这些值。 我们也假设

如果
cbxGramEnabled
在运行时在该行代码上包含对
复选框
实例的引用,则
checked
的值可以永不
null
,除非其框架实现中存在一些奇怪的错误。我假设这是一个.NET复选框?说明:只有当该对象的构造函数已完成运行,并且已将所有属性设置为不同于
null
的默认值时,引用才存在

因为,如果
checked
属性的值为
true
false
,代码将正常执行,正如您尝试使用文本真/假值所证明的那样,我们确信实际值为
null
。语句2证明
cbxGramEnabled
在代码中的该点不包含对象引用。

实际上,变量
cbxGramEnabled
没有实际值,它包含一个
null
引用。原因是您的代码是在创建此复选框之前执行的


通常在web应用程序中,当页面仍在加载(创建组件)且代码在页面完全加载之前执行时,会发生这种情况。这很可能发生在往返服务器之间!!我很确定这就是你的问题所在……

我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。什么叫
WriteToSQL
?这可能与其他地方的代码有关。WritetoSQL代码肯定会运行。如果我将函数调用中的cbxGramEnabled.Checked更改为true或false,它将正常工作。在放置断点时检查它的值是多少?必须是
null
,对吗?是否还会引发任何SqlException或异常?我不知道当您尝试运行空查询时会发生什么。最后,视图的代码是什么,复选框实际放在哪里?我无法访问运行表单的代码,因此无法剪切和粘贴该代码;很抱歉这是该web应用程序中的自定义组件。我知道没有例外,当我在调用函数时转储true或false时,update函数工作得非常好。我打赌复选框控件是空的,即使在提交表单之前我在复选框中有一个复选框。我明白你所说的,我认为你在正确的轨道上。但是,表单是通过复选框生成的(并且由SQL DB ok根据my SQL表中的值呈现)。我选中复选框并提交表单,然后在出现问题时提交表单,因此仅在更新表单时提交。从我的coldfusion时代开始,在我选中复选框之前,应该已经生成了此表单。该复选框位于我的服务器上的web应用的自定义组件中。要以这种方式引用checkbox控件,我需要做什么特别的事情吗?@NeonBlue当您回发到服务器时,我认为您实际回发到服务器的内容(使用http post)应该仍然包含对该页面中所有控件的引用。不知何故,你的情况并非如此。我认为你应该提供更多关于你所使用的真正技术的信息,例如,这是ASP还是什么?。。。现在,我很确定问题不在页面提供时服务器和客户端之间,而是在每次收到“响应”(即第二个请求应该是http post)时客户端和服务器之间;很抱歉我只知道他提供了一个方法来加载一个带有控件的.dll。@NeonBlue所以你使用的控件来自于这个dll,对吗?但是
cbxGramEnabled
的值从何而来?您的代码如何“知道”(编译)已启用的
cbxGramEnabled
是复选框,并且具有已选中属性?如果您说您根本无法访问表单代码…我有ascx文件: