Я все еще новичок в разработке приложений в Visual Studio (недавно преобразованных из MS Access), и я пишу свой код на VB. net. Мой вопрос касается того, как изменить вторичное поле со списком на основе выбора другого. Все мои результаты хранятся в отдельной SQL серверной базе данных.
Когда вызывается моя форма, будет выполняться следующее:
Public Sub New(ByVal _PartID As String)
InitializeComponent() 'Required at the begining of calling a new form'
LoadCombobox(cboArea, "SELECT [ID], [Name], [MRPShow] FROM [LocationArea] WHERE [MRPShow] = 1", "Name", "ID")
cboArea.SelectedValue = 0
cboBay.SelectedValue = 0
LoadPartData(_PartID)
End Sub
Public Sub LoadCombobox(_cbo As ComboBox, _query As String, _displayMember As String, _valueMember As String)
Dim SQL As New SQLControl
_cbo.Items.Clear()
SQL.ExecQuery(_query)
If SQL.HasException(True) Then Exit Sub
_cbo.DataSource = SQL.DBDT
_cbo.DisplayMember = _displayMember
_cbo.ValueMember = _valueMember
End Sub
Public Sub LoadPartData(_ID As String)
Sql.AddParam("@ID", _ID)
Sql.ExecQuery("SELECT * FROM [Part] " &
"WHERE ID = @ID")
If Sql.RecordCount < 1 Then
MsgBox("No item found.")
Exit Sub
End If
For Each r As DataRow In Sql.DBDT.Rows
txtID.Text = r("ID").ToString()
txtMRPID.Text = r("MRP_ID").ToString()
txtPartName.Text = r("PartName").ToString()
txtManufacturer.Text = r("Manufacturer").ToString()
txtManufacturerPartNo.Text = r("PartNumber").ToString()
cboVendor1.SelectedValue = r("Vendor1")
txtWebsiteVendor1.Text = r("Vendor1Link").ToString()
cboVendor2.SelectedValue = r("Vendor2")
txtWebsiteVendor2.Text = r("Vendor2Link").ToString()
cboVendor3.SelectedValue = r("Vendor3")
txtWebsiteVendor3.Text = r("Vendor3Link").ToString()
cboArea.SelectedValue = r("LocationArea")
cboBay.SelectedValue = r("LocationBay")
cboRack.SelectedValue = r("LocationRack")
cboPartAssembly.SelectedValue = r("PartAssembly")
txtDrawingNo.Text = r("DrawingNumber").ToString()
txtImagePath.Text = r("Image").ToString()
Next
If Not String.IsNullOrEmpty(txtWebsiteVendor3.Text) Then
Process.Start(txtWebsiteVendor3.Text)
End If
End Sub
Фрагмент из моего класса SQLControl
Imports System.Data.SqlClient
Public Class SQLControl
Private DBCon As New SqlConnection("---HIDDEN---")
Private DBCmd As SqlCommand
' DB DATA
Public DBDA As SqlDataAdapter
Public DBDT As DataTable
' QUERY PARAMETERS
Public Params As New List(Of SqlParameter)
' QUERY STATISTICS
Public RecordCount As Integer
Public Exception As String
Public Sub New()
End Sub
' ALLOW CONNECTION STRING OVERRIDE
Public Sub New(ConnectionString As String)
DBCon = New SqlConnection(ConnectionString)
End Sub
' EXECUTE QUERY SUB
Public Sub ExecQuery(Query As String, Optional ReturnID As Boolean = False)
' RESET QUERY STATS
RecordCount = 0
Exception = ""
Try
DBCon.Open()
' CREATE DB COMMAND
DBCmd = New SqlCommand(Query, DBCon)
' LOAD PARAMS INTO DB COMMAND
Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))
' CLEAR PARAM LIST
Params.Clear()
' EXECUTE COMMAND & FILL DATASET
DBDT = New DataTable
DBDA = New SqlDataAdapter(DBCmd)
RecordCount = DBDA.Fill(DBDT)
If ReturnID = True Then
Dim ReturnQuery As String = "SELECT @@IDENTITY As LastID;"
DBCmd = New SqlCommand(ReturnQuery, DBCon)
DBDT = New DataTable
DBDA = New SqlDataAdapter(DBCmd)
RecordCount = DBDA.Fill(DBDT)
End If
Catch ex As Exception
' CAPTURE ERROR
Exception = "ExecQuery Error: " & vbNewLine & ex.Message
Finally
' CLOSE CONNECTION
If DBCon.State = ConnectionState.Open Then DBCon.Close()
End Try
End Sub
' ADD PARAMETERS
Public Sub AddParam(Name As String, Value As Object)
Dim NewParam As New SqlParameter(Name, Value)
Params.Add(NewParam)
End Sub
' ERROR CHECKING
Public Function HasException(Optional Report As Boolean = False) As Boolean
If String.IsNullOrEmpty(Exception) Then Return False
If Report = True Then MsgBox(Exception, MsgBoxStyle.Critical, "Exception:")
Return True
End Function
End Class
Я надеюсь достичь того, что при изменении значения [cboArea] следующее поле со списком [cboBay] будет обновлено следующим образом:
Private Sub cboArea_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboArea.SelectedIndexChanged
cboBay.SelectedValue = 0
Try
SQL.AddParam("@SelectedValueOfcboArea", cboArea.SelectedValue)
SQL.ExecQuery("SELECT [ID], [Name], [LocationAreaID] FROM [LocationBay] WHERE [LocationAreaID] = @SelectedValueOfcboArea")
If SQL.HasException(True) Then Exit Sub
cboBay.DataSource = SQL.DBDT
cboBay.DisplayMember = "Name"
cboBay.ValueMember = "ID"
Catch ex As Exception
End Try
End Sub
То, что у меня выше, похоже, работает правильно, однако, когда я впервые открываю форму с определенным c partID, я получаю следующие сообщения об ошибках:
введите описание изображения здесь
Я считаю, что это ошибки из кода инициализации, где данные детали загружаются в каждый элемент управления, вызывая, таким образом, событие onValueChanged, которое продолжает генерировать ошибку исключения, однако я изо всех сил пытаюсь определить, как чтобы решить эту проблему, поскольку я говорю, что код работает нормально после того, как форма загружена, и пользователь сделает свое дело. лучший способ сделать это? Я знаю, что большинство людей следуют этому принципу, но я также изучал наборы данных и привязывал их к элементам управления, но я не видел статьи, в которой говорилось бы, какой стиль реализации лучше / быстрее?