我试图用复选框创建一个简单的数据表单。它就像一个职责申请表,其中复选框代表每个职责空缺。
我正在测试它,因此只需从下拉列表(ddlID)中选择userID。
每当更改ddlID的选定索引时,从数据库中提取职责数据并向表格用户显示,因此用户可以请求可用的插槽或在他/她之前请求时释放插槽。如果某人之前已经请求了某个特定的广告位,则该特定的复选框将被禁用。
以下是我页面背后的代码。
string PCS1, R1S1 = "somevalue";
protected void Page_Load(object sender, EventArgs e)
{
lblDate.Text = DateTime.Now.ToLongDateString();
}
protected void ddlID_SelectedIndexChanged(object sender, EventArgs e)
{
if (IsPostBack)
{
SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString);
SqlCommand cmd = sqlConn.CreateCommand();
cmd.CommandText = "SELECT * FROM tbl_duty_location WHERE Shift = 'S1'";
sqlConn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
if (reader["PC"].ToString() == "n")
{
PCS1 = "n";
}
else if (reader["PC"].ToString() != "n")
{
PCS1 = reader["PC"].ToString();
}
if (reader["R1"].ToString() == "n")
{
R1S1 = "n";
}
else if (reader["R1"].ToString() != "n")
{
R1S1 = reader["R1"].ToString();
}
}
}
if (PCS1 == ddlID.SelectedItem.ToString())
{
chkPCS1.Enabled = true;
chkPCS1.Checked = true;
}
else if (PCS1 == "n")
{
chkPCS1.Enabled = true;
chkPCS1.Checked = false;
}
else if (PCS1 != ddlID.SelectedItem.ToString())
{
chkPCS1.Enabled = false;
chkPCS1.Checked = false;
}
if (R1S1 == ddlID.SelectedItem.ToString())
{
chkR1S1.Enabled = true;
chkR1S1.Checked = true;
}
else if (R1S1 == "n")
{
chkR1S1.Enabled = true;
chkR1S1.Checked = false;
}
else if (R1S1 != ddlID.SelectedItem.ToString())
{
chkR1S1.Enabled = false;
chkR1S1.Checked = false;
}
reader.Close();
sqlConn.Close();
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (chkPCS1.Enabled == false)
{
Trace.Write("PCS1 is: ", PCS1);
}
else if (chkPCS1.Checked == false)
{
PCS1 = "n";
}
else if (chkPCS1.Checked)
{
PCS1 = ddlID.SelectedItem.ToString();
}
if (chkR1S1.Enabled == false)
{
Trace.Write("R1S1: ", R1S1);
}
else if (chkR1S1.Checked == false)
{
R1S1 = "n";
}
else if (chkR1S1.Checked)
{
R1S1 = ddlID.SelectedItem.ToString();
}
SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString);
SqlCommand cmd = sqlConn.CreateCommand();
cmd.CommandText = "UPDATE tbl_duty_location SET PC = @PC1, R1 = @R1 WHERE Shift = '1'";
cmd.Parameters.AddWithValue("PC1", PCS1);
cmd.Parameters.AddWithValue("R1", R1S1);
sqlConn.Open();
cmd.ExecuteNonQuery();
sqlConn.Close();
}
目前,在表中,列“PC”已经具有userID,这意味着特定的插槽不可用。
但是,当我尝试使用不同的userID请求另一个插槽时,我收到了以下错误。
The parameterized query '(@PC1 nvarchar(4000),@R1 nvarchar(9))UPDATE tbl_duty_location SE' expects the parameter '@PC1', which was not supplied.
实际上,@ PC1应该是从数据库加载的PCS1,但是一旦发生btn_submit点击事件,PCS1立即变为空。
可能是什么问题?
答案 0 :(得分:0)
如果我理解你的问题:
ASP.NET像其他网络语言一样工作。因此,当您触发ddlID_SelectedIndexChanged
btnSubmit_Click
事件中填充的变量已消失
在两个事件之间,变量消失了......您可以multiple ways将所需的值存储在页面的hidden field中,例如session变量中。
答案 1 :(得分:0)
如果将null值传递给参数,即使添加参数,也会出现此错误 所以尝试检查值,如果为null,则使用DBNull.Value属性
这会将对象图层的空值转换为数据库可接受的DBNull值。