单击以编程方式添加的按钮时出错

时间:2018-01-31 14:33:53

标签: vb.net winforms

我正在尝试以编程方式生成按钮并向其添加事件处理程序,并且我已成功创建按钮但是当我单击其中一个时,我收到以下消息对象引用未设置为实例对象

以下是创建按钮的代码:

    Dim i As Integer = 1
    For Each dtab As DataTable In ds.Tables
        For Each drow As DataRow In dtab.Rows
            If (CInt(drow(3)) < CInt(drow(4))) Then
                Dim l As New Label()
                With l
                    .Location = New System.Drawing.Point(30, 40 * i)
                    .Text = "product number  " & drow(0) & " has reached the minimal quantity"
                    .Width = 300
                    Panel3.Controls.Add(l)
                End With
                Dim b As New Button()
                With b
                    .Location = New System.Drawing.Point(350, 40 * i)
                    .Enabled = True
                    .Width = 100
                    .Text = "fill stock"
                    Panel3.Controls.Add(b)
                    AddHandler b.Click, AddressOf Me.Button_Click
                End With
                i = i + 1
            End If

        Next
    Next

点击按钮的代码如下:

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim co As New SqlConnection("server=JAMMINGJACK-PC\SQLEXPRESS ;initial catalog=td3;integrated security=true;")
    Try
        Dim cmd As New SqlCommand

        co.Open()
        cmd.Connection = co
        cmd.CommandText = "Update article set qteStck=(qteStck+(seuilmin*3)) where numart=" & drow(0) '
        cmd.CommandType = CommandType.Text
        cmd.ExecuteNonQuery()
        co.Close()
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical, Me.Text)
    End Try
End Sub

1 个答案:

答案 0 :(得分:0)

您的事件处理程序中此行有两个大问题:

cmd.CommandText = "Update article set qteStck=(qteStck+(seuilmin*3)) where numart=" & drow(0) '

第一个问题是代码疯狂易受sql注入攻击。这是问题的一个侧面问题,但这是重要,您应该花几分钟时间查看Google参数化查询以及如何使用它们。

第二个问题是drow(0)表达式。该变量在此方法中没有意义。它的作用域是创建按钮的代码中的For Each循环,但这里没有任何意义。这个编译完全意味着您要么尝试在类级别重新声明它(这将无济于事;这将是不同的 drow变量)或转为{{1} } off,这是非常糟糕的做法。

有几种方法可以解决此问题,例如对Option Strict属性中的drow(0)值进行编码或从Tag推断出来。我在这里的首选方法是创建一个自定义控件,将标签和按钮组合在一起。