我有一个奇怪的问题,我似乎无法弄清楚。我为我在服务器上运行的商业应用程序创建了一个Web组件。如果我将cbxGramEnabled.Checked
更改为True
或False
,则该功能运行正常并进行更改。但是,如果我离开cbxGramEnabled.Checked
,则该功能不会更新数据库。
运行组件的代码如下所示:
private void WriteToSQL( )
{
WriteEnableGram( _pkKey, cbxGramEnabled.Checked);
}
我的自定义组件上的cbxGramEnabled.Checked
是CheckBox
。
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....
}
}
答案 0 :(得分:0)
首先,我们假设以下情况属实:
布尔值可以是
true
;false
或null
(未分配)。
复选框的checked
属性可以包含这些值。
我们也假设
如果
cbxGramEnabled
在运行时在该行代码中包含对Checkbox
实例的引用,则checked
的值永远不会为{{1}除非它的框架实现中有一些奇怪的错误。我假设这是一个.NET复选框?说明:仅当该对象的构造函数已完成运行并且已将所有属性设置为与null
不同的默认值时,才存在引用。
因为,如果null
属性的值为checked
或true
,则代码将正常执行,正如您尝试使用文字真/假值所证明的那样,< strong>我们确定实际值为false
。声明2证明 null
在您的代码中不包含对象引用。
基本上,变量cbxGramEnabled
没有实际值,它包含cbxGramEnabled
引用。原因是您的代码在创建此复选框之前执行。
通常在Web应用程序中,当页面仍在加载(创建组件)并且您的代码在页面完全加载之前执行时,会发生这种情况。这可能发生在到服务器的往返之间!我很确定这就是问题所在......