2013-05-04 3 views
0

Эта программа - система бронирования мест, и у меня возникают проблемы при проверке наличия каждого места.Объектов в массиве, изменение их свойств

Когда форма загружается, создается массив и хранит имена мест. Каждое место - это флажок, отображаемый в виде кнопки. Оператор SQL запускается и находит записи с нулевым идентификатором клиента, идентификатором места этого места и датой показа пятницы. Если количество возвращенных записей = 1, задний цвет кнопки галочки станет зеленым, иначе он станет красным.

Код для проверки доступности работает отлично, я просто не уверен, как изменить задний цвет флажка в этой позиции массива для изменения. Я считаю, что это потому, что массив содержит строки, а не объекты. Я провел много исследований по этому вопросу, и я не могу найти решение.

Что мне нужно - это имя места (A1, A2 и т. Д.), Которое должно храниться в массиве, чтобы оно могло использоваться в инструкции SQL, а также способ изменить задний цвет этого места , Всего в общей сложности 197 мест, поэтому мне нужно будет сделать это с помощью массива.

Я был бы очень признателен за решение этой проблемы, и я приведу всю информацию ниже, включая скриншот таблицы базы данных, скриншот дизайна формы и кода.

База данных таблицы: http://gyazo.com/0cf669a1c2144b7174066bdbbd29d3a3

Дизайн формы: http://gyazo.com/b9400018cccd61afb83518e3754df2d4

Private Sub frmSeatPlan_Load(sender As System.Object, e As System.EventArgs)  Handles MyBase.Load 
    Dim seat(11, 15) As String 
    Dim seatname As String 
    Dim sql As String 
    Dim da As OleDb.OleDbDataAdapter 

    seat(1, 1) = A1.Name 
    seat(1, 2) = A2.Name 
    seat(1, 3) = A3.Name 
    seat(1, 4) = A4.Name 
    seat(1, 5) = A5.Name 
    seat(1, 6) = A6.Name 
    seat(1, 7) = A7.Name 
    seat(1, 8) = A8.Name 
    seat(1, 9) = A9.Name 
    seat(1, 10) = A10.Name 
    seat(1, 11) = A11.Name 
    seat(1, 12) = A12.Name 
    seat(1, 13) = A13.Name 
    seat(1, 14) = A14.Name 

    Dim x As Integer 
    Dim y As Integer 
    For y = 1 To 1 
     For x = 1 To 14 
      seatname = seat(y, x) 

      con.ConnectionString = dbProvider & dbSource 
      con.Open() 'opens the connection to the database 

      sql = "SELECT * FROM Bookings where show_id = 'friday' AND customer_ID is null AND seat_id ='" & seatname & "'" 
      da = New OleDb.OleDbDataAdapter(sql, con) 'create a data adapter to store the filtered data using the SQL code 
      MsgBox(sql) 
      da.Fill(ds, seat(y, x)) 

      'count the number of records with an empty customer id, the show ID of Friday and the seat ID of this seat. 
      Dim recordCount As Integer 
      recordCount = ds.Tables(seat(y, x)).Rows.Count 
      MsgBox(recordCount) 

      If recordCount = 1 Then 
       'change backcolor to green 


      Else 
       'change backcolor to red 

      End If 

      con.Close() 


     Next x 
    Next y 
End Sub 
+0

редактировать свой предыдущий вопрос http://stackoverflow.com/questions/16342882/vb-2010-changing-object-properties-in-a-loop, а не создавать новую – user1937198

+0

@ user1937198 жаль, что я удалил старый вопрос. Надеюсь, что это решило проблему. – darkjoe31

+0

Какую нагрузку вы ожидаете на этом сайте, поскольку загрузка страниц будет дорогостоящей с 197 запросами БД на страницу? – user1937198

ответ

0

Поместите элементы управления в массиве, а не только их имена. Затем используйте свойство Name из массива, когда оно вам нужно, и вы можете получить доступ к BackColor или любым другим свойствам/методам, когда они вам понадобятся.

Как это:

Private Sub frmSeatPlan_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Dim seat(11, 15) As Control '** changed from String ** 
    Dim seatname As String 
    Dim sql As String 
    Dim da As OleDb.OleDbDataAdapter 

    seat(1, 1) = A1 
    seat(1, 2) = A2 
    seat(1, 3) = A3 
    seat(1, 4) = A4 
    seat(1, 5) = A5 
    seat(1, 6) = A6 
    seat(1, 7) = A7 
    seat(1, 8) = A8 
    seat(1, 9) = A9 
    seat(1, 10) = A10 
    seat(1, 11) = A11 
    seat(1, 12) = A12 
    seat(1, 13) = A13 
    seat(1, 14) = A14 

    Dim x As Integer 
    Dim y As Integer 
    For y = 1 To 1 
     For x = 1 To 14 
      seatname = seat(y, x).Name 

      con.ConnectionString = dbProvider & dbSource 
      con.Open() 'opens the connection to the database 

      sql = "SELECT * FROM Bookings where show_id = 'friday' AND customer_ID is null AND seat_id ='" & seatname & "'" 
      da = New OleDb.OleDbDataAdapter(sql, con) 'create a data adapter to store the filtered data using the SQL code 
      MsgBox(sql) 
      da.Fill(ds, seat(y, x).Name) 

      'count the number of records with an empty customer id, the show ID of Friday and the seat ID of this seat. 
      Dim recordCount As Integer 
      recordCount = ds.Tables(seat(y, x).Name).Rows.Count 
      MsgBox(recordCount) 

      If recordCount = 1 Then 
       'change backcolor to green 
       seat(x, y).BackColor = Color.Green 
      Else 
       'change backcolor to red 
       seat(x, y).BackColor = Color.Red 
      End If 

      con.Close() 

     Next x 
    Next y 
End Sub 
+0

Спасибо большое! Это, похоже, решило эту проблему, однако кажется, что произошел другой. Теперь, когда я запускаю программу, цикл работает только до тех пор, пока x = 2, а затем не отобразит форму с отмеченным только A1. Что-нибудь еще в коде противоречит изменениям, которые вы внесли? или есть ли ошибка в моих циклах? – darkjoe31

+0

Ну, технически другой вопрос, но, вероятно, он где-то забрасывает ошибку. Либо добавьте некоторую обработку ошибок (Try..Catch), либо выполните ее с помощью отладчика. – RBarryYoung

+0

проблема решена :) спасибо! – darkjoe31

Смежные вопросы