Выберите и отобразите все строки, принадлежащие определенному идентификатору - PullRequest
2 голосов
/ 17 марта 2019

у меня

Таблица студент , студент_субъект и субъект_бз

      "student"
-----------------------
|studentID | FullName |
-----------------------
|1234      | John    |
|1235      | Michael |
|1236      | Bryce   |

        "subject_bsit"
-----------------------------------
|subject_id| subject_name  |grade |
-----------------------------------
|    1     | Programming   |  3   |
|    2     | Networking    |  2.5 |
|    3     | Algorithm     |  1.75|
|    4     | Physical Educ |  2   |

This is the Junction table to connect the 
two now.

       "student_subject"
----------------------------
| student_id | subject_id |
----------------------------
|   1235     |      1     |
|   1235     |      2     |
|   1235     |      3     |
|   1234     |      1     |

Как вы можете видеть, идентификатор таблицы 1235 - Майкл. У него три три предмета, subject_id 1,2 и 3. Я хочу сделать так, чтобы все имена и оценки Майкла отображались в текстовых полях, а не в виде таблицы данных. ,

На данный момент мне все еще не удалось вывести его в текстовые поля. Это мой пример запроса

    sql = "SELECT subject_name " & _
        " FROM student_subject " & _
        " INNER JOIN subject_bsit ON subject_bsit.subject_id = student_subject.sub_id" & _
        " where student_subject.student_id='" & Txtbox.Text & "'"

В Txtbox.text в последнем запросе пользователь вводит идентификационный номер.

Это мой код при отображении данных в текстовое поле. У меня нет идеи или подхода к тому, как сделать цикл в текстовом поле и отобразить его в каждом текстовом поле.

 cmd = New MySqlCommand(sql, myconn)
    dr = cmd.ExecuteReader

    While dr.Read
        TextBox1.Text = dr.Item("subject_name").ToString
        TextBox2.Text = dr.Item("subject_name").ToString
    End While

Это пример пользовательского интерфейса того, чего я пытаюсь достичь. Большое вам спасибо.

enter image description here

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Когда вы читаете набор результатов запроса, вы используете цикл, как вы знаете.

While dr.Read
    ' run this for every row in your resultset 
    ...
End While

Цикл While продолжается до тех пор, пока вы не прочитаете все строки.

Вам не нужно использовать цикл. Если вы хотите, чтобы вы могли читать строки по одной, например,

 If dr.Read
    ' just the first row
 End If
 If dr.Read
    ' just the second row
 End If
 If dr.Read
    ' just the third row
 End If
 ...

От вашего вопроса, я думаю, у вас есть Textbox1, Textbox2, ... Textbox5 в вашей форме. Я также думаю, что у вас есть Grade1, Grade2 ....

Чтобы обработать как имя субъекта, так и оценку, измените первую строку запроса на

   sql = "SELECT subject_name, grade " & _

Вы можете заполнить эти элементы так:

 If dr.Read
    TextBox1.Text = dr.Item("subject_name").ToString
    Grade1.Text = dr.Item("grade").ToString
 End If
 If dr.Read
    TextBox2.Text = dr.Item("subject_name").ToString
    Grade2.Text = dr.Item("grade").ToString
 End If
 If dr.Read
    TextBox3.Text = dr.Item("subject_name").ToString
    Grade3.Text = dr.Item("grade").ToString
 End If
 ' more of these sets of four lines to fill your whole form.

Это решит вашу проблему. Но вы, наверное, заметили, что это нелепо повторяется. Что вам действительно нужно, так это массив (фактически два массива) текстовых полей. Вы создаете, а затем заполняете эти текстовые поля в своей программе. Я не отлаживал это: это для вас.

  Dim Subjects As Textbox()
  Dim Grades As Textbox()
  ...

  Dim rownumber, Y
  rownumber = 0
  Y = 200
  Dim Subject
  Dim Grade
  While dr.Read
    Subject = New Textbox
    Subject.Text = dr.Item("subject_name").ToString
    Subject.Width = 200
    Subject.Height = 40
    Subject.X = 175
    Subject.Y = Y
    Subjects(rownumber) = Subject
    Form.Controls.Add(Subject)
    Grade = New Textbox
    Grade.Text = dr.Item("grade").ToString
    Grade.Width = 50
    Grade.Height = 40
    Grade.X = 400
    Grade.Y = Y
    Grades(rownumber) = Grade
    Form.Controls.Add(Grade)
    rownumber = rownumber + 1
    Y = Y + 50
  End While

При этом у вас будет два столбца элементов управления, по одному для каждого субъекта. Но этот код сложен, и вы должны сделать всю компоновку вашей формы с помощью Something.Y = value и затем Y = Y + 50 арифметики.

Вот почему существуют элементы управления сеткой. Они заботятся о подобных вещах.

0 голосов
/ 17 марта 2019

Если вы хотите динамически создавать текстовые поля, вам следует обратиться к ответу @OJones

. Вы можете просто зациклить Me.Controls.OfType(Of TextBox)()

cmd = New MySqlCommand(sql, myconn)
dr = cmd.ExecuteReader

While dr.Read
    For Each txt As TextBox In Me.Controls.OfType(Of TextBox)()
        txt.Text = dr.Item("subject_name").ToString
    Next
End While

ИлиВы можете сделать аналогичный подход, если вам нужно заполнить имя первого субъекта внутри текстовых полей (если возвращаемых тем больше, чем текстовых полей, дополнительные темы будут игнорироваться) :

While dr.Read = True

    Dim txt As New TextBox = DirectCast(Me.Controls.Find(string.Format("Textbox{0}", cnt ),false).FirstOrDefault(),Textbox);

    If Not txt Is Nothing Then txt.Text = dr.Item("subject_name").ToString

    cnt += 1

End While
dr.Close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...