我正在尝试以编程方式生成按钮并向其添加事件处理程序,并且我已成功创建按钮但是当我单击其中一个时,我收到以下消息对象引用未设置为实例对象。
以下是创建按钮的代码:
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
答案 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
推断出来。我在这里的首选方法是创建一个自定义控件,将标签和按钮组合在一起。