2017-02-17 1 views
0

私は動的に追加されたボタンのテキストを変更することによってこの問題を抱えています。 ボタンのテキストを「選択」から「更新」に変更したい。動的ボタンを追加し、そのプロパティテキストを変更します。 VB.NET

これは私のコードです。

dim oButton as button 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

Dim dr As SqlDataReader 
    Dim cn As SqlConnection = New SqlConnection("Data Source=server;Initial Catalog=testDB;Integrated Security=True;MultipleActiveResultSets=true;") 
    cmd.Connection = cn 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.CommandText = "votecand" 
    Dim stream As New MemoryStream() 
    cn.Open() 
    dr = cmd.ExecuteReader 
    If dr.HasRows = True Then 
     while dr.read 
      oButton = New Button 
      oButton.Enabled = True 
      oButton.Font = New Font("Tahoma", 11, FontStyle.Regular) 
      oButton.Location = New Point(ButtonNumber * 30, ButtonNumber * 30) 
      oButton.Name = "MyButton" & ButtonNumber.ToString 
      oButton.Size = New Size(134, 34) 
      oButton.BackColor = Color.MediumSeaGreen 
      oButton.FlatStyle = FlatStyle.Flat 
      oButton.ForeColor = Color.White 
      oButton.Text = "Select" 
      oButton.Visible = True 
      oButton.Dock = DockStyle.Bottom 
      oButton.Tag = ButtonNumber 
      AddHandler oButton.Click, AddressOf onButtonClick 
      Me.Controls.Add(oButton) 
     End while 
    End if 
End sub 

このコードはMyFuncと機能が

Private Sub MyFunc(ByVal ButtonNumber As Integer) 

    Dim cn As SqlConnection = New SqlConnection("Data Source=server;Initial Catalog=testDB;Integrated Security=True;MultipleActiveResultSets=true;") 
    Dim command As New SqlCommand 

    command = New SqlCommand("select first_name,middle_name,last_name,position,gender,course,year_level,aff,student_id from tbl_cand where [email protected]", cn) 
    command.Parameters.AddWithValue("@id", SqlDbType.VarChar).Value = ButtonNumber.ToString 

    Dim dt As New DataTable() 
    Dim adapater As New SqlDataAdapter(command) 
    adapater.Fill(dt) 

    Dim fname As String = dt.Rows(0).ItemArray(0).ToString 
    Dim mname As String = dt.Rows(0).ItemArray(1).ToString 
    Dim lname As String = dt.Rows(0).ItemArray(2).ToString 
    Dim gender As String = dt.Rows(0).ItemArray(3).ToString 
    Dim course As String = dt.Rows(0).ItemArray(4).ToString 
    Dim year As String = dt.Rows(0).ItemArray(5).ToString 
    Dim aff As String = dt.Rows(0).ItemArray(6).ToString 
    Dim studid As String = dt.Rows(0).ItemArray(7).ToString 

    lblfname.Text = fname 
    lblmname.Text = mname 
    lbllname.Text = lname 
    lblgender.Text = gender 
    lblyear.Text = year 
    lblmajor.Text = course 
    lblaff.Text = aff 

    connect() 
    sql = "INSERT INTO tbl_castvote(can_id,fname,img,student_id)" 
    sql = sql + "VALUES(@canid,@fname,@pos,@img,@voterid,@stdid)" 
    cmd = New SqlCommand(sql, con) 
    With cmd 
     .Parameters.AddWithValue("canid", studid) 
     .Parameters.AddWithValue("fname", fname) 

     Dim ms As New MemoryStream() 
     pb.Image.Save(ms, pb.Image.RawFormat) 
     Dim data As Byte() = ms.GetBuffer() 
     Dim p As New SqlParameter("@img", SqlDbType.VarBinary) 
     p.Value = data 
     .Parameters.Add(p) 

     .Parameters.AddWithValue("stdid", studentid.Text) 
    End With 

    If MsgBox("You have selected" & " '" & fname & " " & mname & " " & lname & "' " & "as" & " '" & pos & "' ", vbOKCancel + vbInformation, "Voting System") = vbOK Then 
     cmd.ExecuteNonQuery() 
     oButton.Text = "Update" --> this line is my problem. Can't change the oButton.text "Select" to "Update" 
    End If 

End Sub 

であり、これは私のボタンのクリックハンドラである

Private Sub onButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Dim ButtonNumber As Integer 
    If CType(sender, Button).Tag IsNot Nothing Then 
     If Integer.TryParse(CType(sender, Button).Tag.ToString, ButtonNumber) Then 
      MyFunc(ButtonNumber) 
     End If 
    End If 
End Sub 

のplsは私を助けて。ありがとうございます

+0

その行はどうなりますか?間違いはありますか? –

+1

'.Parameters.AddWithValue(" canid "、studid)' @canid "にする必要があります。デバッガでコードをステップ実行し、何が起こるかを確認する必要があります。私たちはあなたのためにそれをすることはできません。 – LarsTech

+0

oButtonは、アクセスしようとする時点までに範囲外になっています。 FindControlを使用して再度検索し、設定します。 –

答えて

1

いくつかの問題があります。

cmd.ExecuteNonQuery() 
Dim btn As Button = Me.Controls.OfType(Of Button). 
        Where(Function(x) x.Name = "myButton" & btnNumber.ToString). 
        FirstOrDefault() 
If btn IsNot Nothing Then 
    btn.Text = "Update" 
End If 

は一意であるためにあなたの関数のパラメータを変更します。あなたの関数で次に

while dr.read 
    ButtonNumber += 1 
    oButton = New Button 
    oButton.Name = "MyButton" & ButtonNumber.ToString 

、あなたはそれを更新するあなたのボタンを見つけに持っている:あなたは、あなたのループ内にごButtonNumber値をインクリメントする必要があります。

Private Sub MyFunc(btnNumber As Integer) 
+0

ありがとうございます。それは素晴らしい作品です! –

+0

それは私が言及した他のアプローチです。 –

0

複数のボタンに1つの参照を使用しています。上記のコードから2つのオプションがあります。あなたはmyFuncという中で、あなたのループ内

Buttons = New List(of Button) 

Dim oButton = New Button 
    ButtonNumber = Buttons.Count '<-- use the collection count as the number 
    ...blah blah blah... 
    Buttons.Add(oButton) 

次に、あなたのループを開始する前にリスト

Private Buttons As List(of Button) 

で追加したボタンの参照保存

1単に私たち電子

Buttons(ButtonNumber).Text = "whatever" 

2.これは、あなたがそれを参照する唯一の場所である場合は、代わりに沿って送信者を渡します。

Private Sub MyFunc(Byref Pressed_Button as Button, ByVal ButtonNumber As Integer) 
     ...blah blah blah... 
     Pressed_Button.Text = "whatever" 
End Sub 

Private Sub onButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Dim PressedButton as Button = CType(sender, Button) 
    Dim ButtonNumber As Integer 
    If PressedButton.Tag IsNot Nothing Then 
     If Integer.TryParse(PressedButton.Tag.ToString, ButtonNumber) Then 
      MyFunc(PressedButton, ButtonNumber) 
     End If 
    End If 
End Sub 

あり、名前でコントロールを検索する方法もありますが、独自のインデックスを維持することは、より効率的です。

+0

ButtonNumber = Buttons.Countは、 "オブジェクト参照がオブジェクトのインスタンスに設定されていません"というエラーを返します。 –

+0

Ooops .. edit ... –

+1

ohh ok!を参照してください。このコードはうまく動作します。あなたの時間に感謝します。よく感謝! –

関連する問題