ASP/VB.NET -CheckChanged上的复选框未使用“已更改”值更新

jgovgodb  于 2023-02-26  发布在  .NET
关注(0)|答案(1)|浏览(130)

我有一个复选框,当选中它时,我希望运行一个更新过程来更新复选框传递的值。当我选中复选框时,我希望它将true传递到存储过程中。但我得到的却是相反的结果。我的处理程序工作正常,所有内容都传递到了过程中,但我的复选框值与我刚才执行的操作相反(即,当检查时,它发送假,即检查之前的值)。
我的调试证实了这一点。我最初的研究让我认为我的ViewState有问题,所以我确保在ASP端的HTML中启用它:

<%@ Page Title="" Language="VB" MasterPageFile="~/MasterStuff.master" AutoEventWireup="false" EnableViewState="true" CodeFile="Stuff.aspx.vb" Inherits="Test_Stuff" %>

但这似乎并没有改变任何东西,我的复选框编码如下:

<asp:TableRow>
  <asp:TableCell>
    <asp:CheckBox runat="server" ID="chkChecked" AutoPostBack="true" />
  </asp:TableCell>
</asp:TableRow>

在VB端,我的处理程序和对存储过程的调用:

Private Sub chkChecked_Checked(ByVal sender As Object, ByVal e As EventArgs) Handles chkChecked.CheckedChanged
    UpdateStatus()
End Sub

Public Sub UpdateStatus()
    Using sqlCmd As New SqlCommand
        Try
            With sqlCmd
                .CommandType = CommandType.StoredProcedure
                .CommandText = "UpdateStatus"
                .Connection = SqlCn
                .Parameters.Clear()
                .Parameters.Add("@Checked", SqlDbType.Bit).Value = chkChecked.Checked
                .ExecuteNonQuery()
            End With

            LoadPage()
        Catch ex As Exception
            lblError.AppendNewLine("The following error was thrown in UpdateStatus:<br>" + ex.Message)
        End Try
    End Using
End Sub
hts6caw3

hts6caw31#

问题是我们可能有1或20个复选框。
那么,这是指页面上的哪个复选框呢?

.Parameters.Add("@Checked", SqlDbType.Bit).Value = chkChecked.Checked

它可以是页面上的“任何”一个。
因此,当您单击复选框时,我们必须“获取”或“抓取”当前复选框。
所以,这应该行得通:

Private Sub chkChecked_Checked(ByVal sender As Object, ByVal e As EventArgs) Handles chkChecked.CheckedChanged
    Dim ckBox As CheckBox = sender

    UpdateStatus(ckBox.Checked)
End Sub

Public Sub UpdateStatus(bolChecked As Boolean)
    Using sqlCmd As New SqlCommand
        Try
            With sqlCmd
                .CommandType = CommandType.StoredProcedure
                .CommandText = "UpdateStatus"
                .Connection = SqlCn
                .Parameters.Clear()
                .Parameters.Add("@Checked", SqlDbType.Bit).Value = bolChecked
                .ExecuteNonQuery()
            End With

            LoadPage()
        Catch ex As Exception
            lblError.AppendNewLine("The following error was thrown in UpdateStatus:<br>" + ex.Message)
        End Try
    End Using
End Sub

编辑:部分跟进

此标记:

但是,更正上述内容后:

<asp:TableRow runat="server">
    <asp:TableCell>
        <asp:CheckBox runat="server" ID="chkChecked" AutoPostBack="true"
            
            />
    </asp:TableCell>
</asp:TableRow>

以及背后的代码:

check box check = True
check box check = False

因此,调试窗口确实显示了传递给例程的复选框的正确输出(值的切换)。
但是,既然复选框按钮不在页面上,那么您是如何设法连接单击事件的呢?
通常,当这样的控件位于表格(或网格视图,或repeater等)中时,您不能(也不会)双击该控件。
因此,您在in markup中执行的操作将以这种方式添加/创建事件:

还有表格,网格视图之类的?
然后你就可以自由地连接事件了,你注意到代码后面的事件现在已经像c#那样连接起来了,这个类没有“handles”标签,如下所示:

Protected Sub chkChecked_CheckedChanged(sender As Object, e As EventArgs)

End Sub

但是,两者都应该起作用。
我怀疑这里需要更多的信息和背景。
不过,我会尝试向表中添加runat=“server”。(还有一个“id”。
但是,复选框的单击事件应该是“发件人”,因此拾取选中的值应该会起作用。
尝试转储句柄chkChecked. CheckedChanged。
(just注解掉该存根)。尝试使用intel-sense创建代码存根,然后将现有代码剪切并粘贴到checkedChanged事件中。
无论哪种方式(checkedChanged事件)都应该触发,但由于这是一个表,并且复选框(理论上)可以重复多次,因此我将使用实际的checkedChanged事件存根,而不是能够/可能拾取任何一个被单击的复选框的“处理程序”。
可能这里缺少一些更新面板或一些其他细节。

相关问题