Jamim Ответов: 1

Я пытаюсь создать combobox, где я могу добавлять данные и обновлять их.


Я пытаюсь создать combobox, где я могу добавлять данные и обновлять их.
Я просто хочу знать, есть ли короткий способ закодировать это? чем я занимаюсь
Как Новичок, мы действительно нуждаемся в помощи таких людей, как вы, чтобы улучшить наш код. Мы очень ценим любую помощь. Я использую Vb.net и Мисс доступ

Private Sub ComboView()
    Dim da As New OleDbDataAdapter()
    Dim dt As New DataTable()
    myConnection.Open()
    da.SelectCommand = New OleDbCommand("Select * from tblReligion", myConnection)
    da.Fill(dt)
    ComboReligion.DataSource = dt
    ComboReligion.DisplayMember = "Religion"
    myConnection.Close()
End Sub
Private Sub ComboView1()
    Dim da As New OleDbDataAdapter()
    Dim dt As New DataTable()
    myConnection.Open()
    da.SelectCommand = New OleDbCommand("Select * from tblBloodtype", myConnection)
    da.Fill(dt)
    ComboBlood.DataSource = dt
    ComboBlood.DisplayMember = "Bloodtype"
    myConnection.Close()
End Sub
Private Sub ComboView2()
    Dim da As New OleDbDataAdapter()
    Dim dt As New DataTable()
    myConnection.Open()
    da.SelectCommand = New OleDbCommand("Select * from tblGroupCompanies", myConnection)
    da.Fill(dt)
    ComboBBB.DataSource = dt
    ComboBBB.DisplayMember = "BBBrothersGroupOfCompanies"
    myConnection.Close()
End Sub
Private Sub ComboView3()
    Dim da As New OleDbDataAdapter()
    Dim dt As New DataTable()
    myConnection.Open()
    da.SelectCommand = New OleDbCommand("Select * from tblPosition", myConnection)
    da.Fill(dt)
    ComboPosition.DataSource = dt
    ComboPosition.DisplayMember = "Position"
    myConnection.Close()
End Sub

Private Sub Form7_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim sCon As String = String.Format("Provider= Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DB_HR.accdb;Jet OLEDB:DATABASE PASSWORD=dbhr123;")
    myConnection.ConnectionString = sCon
    ComboView() 'Religion
    ComboView1() 'Bloodtype
    ComboView2() 'Group of Companies
    ComboView3() 'Position
    myConnection.Close()
End Sub


Что я уже пробовал:

Есть ли способ сделать его коротким?

1 Ответов

Рейтинг:
11

CHill60

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

Private Sub DoTheDatabaseBit(sql As String, cb As ComboBox, disp As String)
    Dim da As New OleDbDataAdapter()
    Dim dt As New DataTable()
    myConnection.Open()
    da.SelectCommand = New OleDbCommand(sql, myConnection)
    da.Fill (dt)
    cb.DataSource = dt
    cb.DisplayMember = disp
    myConnection.Close()
End Sub
Тогда вы можете делать такие вещи, как:
Private Sub ComboView()

    DoTheDatabaseBit ("Select * from tblReligion", ComboReligion, "Religion")
    
End Sub

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

РЕДАКТИРОВАТЬ
Мой последний комментарий относится к твердым принципам программирования.
Вот статья CodeProject с дополнительной информацией
Принципы солидной архитектуры с использованием простых примеров C# [^]


Jamim

Остынь, спасибо. В вашем объяснении "обратите внимание, что это не обязательно хорошее решение - вы должны попытаться отделить доступ к базе данных от обновлений пользовательского интерфейса, поэтому вам, вероятно, нужны две функции - это было просто для демонстрации принципа." Не могли бы вы подробнее объяснить, почему я должен отделять доступ к базе данных от обновлений пользовательского интерфейса? заранее спасибо

Jamim

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

CHill60

Привет, я добавил ссылку на свое решение... поиск "твердые принципы" для получения дополнительной информации...извините за краткость, но в данный момент я только на своем телефоне

Jamim

О, все в порядке, и еще раз спасибо за доброту, но я не знаком с кодом C#, это чужой язык для меня. и кстати пример кода который вы публикуете выше это сделать мой код короче?

CHill60

Ах, извините за C#, но я не могу найти ни одного хорошего примера в VB.NET (за исключением книг) - сосредоточьтесь на словах, стоящих за принципами, например, вот еще одна статья, которая является языковой агностикой Твердые принципы проектирования объяснены - принцип единой ответственности[^]
И да, мое решение было предназначено для того, чтобы сделать ваш код короче. Ваши 50 строк кода могут быть заменены этими 21 строками

Private Sub DoTheDatabaseBit(sql As String, cb As ComboBox, disp As String)
    Dim da As New OleDbDataAdapter()
    Dim dt As New DataTable()
    myConnection.Open()
    da.SelectCommand = New OleDbCommand(sql, myConnection)
    da.Fill (dt)
    cb.DataSource = dt
    cb.DisplayMember = disp
    myConnection.Close()
End Sub
Private Sub Form7_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim sCon As String = String.Format("Provider= Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DB_HR.accdb;Jet OLEDB:DATABASE PASSWORD=dbhr123;")
    myConnection.ConnectionString = sCon

    DoTheDatabaseBit ("Select * from tblReligion", ComboReligion, "Religion")
    DoTheDatabaseBit ("Select * from tblBloodtype", ComboBlood, "Bloodtype")
	DoTheDatabaseBit ("Select * from tblGroupCompanies", ComboBBB, "BBBrothersGroupOfCompanies")
    DoTheDatabaseBit ("Select * from tblPosition", ComboPosition, "Position")

    myConnection.Close()
End Sub

Jamim

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

В этом кодексе, не так ли? отдельный доступ к базе данных от обновления пользовательского интерфейса

Частный Суб ComboView1()
Дим да как новый OleDbDataAdapter()
Дим ДТ в качестве нового объекта DataTable()
myConnection.Открыть()
da.SelectCommand = New OleDbCommand("Select * from tblBloodtype", myConnection)
да.Заполнить(ДТ)
ComboBlood.Источник данных = dt
ComboBlood.DisplayMember = "Группа Крови"
myConnection.Закрывать()

Можете ли вы показать мне пример того, как я могу отделить доступ к базе данных от обновлений пользовательского интерфейса
Извините не очень быстро учусь

CHill60

Нет, вы не разделяете их... у вас есть код, который "знает" о базе данных, что это Ole-база данных, что существует таблица с именем tblBloodtype, например. В том же блоке кода у вас есть код, который "знает о" полях со списком, что у них есть отображаемые элементы и т. д.
Боюсь, что это не тот форум, чтобы вдаваться в глубокие объяснения, да и времени у меня нет. Здесь есть отработанный пример ... Почему Разделение Интересов Имеет Значение? - VB.NET учебники | Dream.In.Code[^] это может помочь, ваш код пользовательского интерфейса должен выглядеть более похожим
Частный Суб ComboView1()

Тусклая кровь как новая группа крови()
ComboBlood.Источник данных = кровь.GetBloodTypes() 'этот метод возвращает datatable
ComboBlood.DisplayMember = "Группа Крови"
Конец Подводной Лодки

Jamim

Научиться правильно писать код действительно трудно, особенно для такого самоучки, как я. Мне действительно нужно много учиться.
Должны ли мы как новички действительно нуждаться в разделении базы данных от обновлений пользовательского интерфейса
что произойдет, если мы не будем отделять базу данных от обновлений пользовательского интерфейса?

Удачного Вам дня мистер Чилл60
В любом случае большое вам спасибо за ссылку

CHill60

Единственное, что действительно когда вы не следуете хорошим принципам, это означает, что ваш код трудно читать, поддерживать и использовать. Я знаю, что это кажется болью думать об этих вещах, когда вы все еще учитесь, но лучше всего войти в хорошие привычки как можно скорее. Я знаю по опыту, что бывает трудно избавиться от вредных привычек, если они укоренились :-)
Но не беспокойтесь слишком сильно об этом - важно продолжать учиться, продолжать пытаться и учиться на ошибках.
Есть отличная книга, которую я рекомендую вам прочитать под названием "прагматичный программист" - и я только что узнал, что она доступна бесплатно с их сайта Прагматичный программист сейчас в DRM-бесплатную электронную книгу | прагматическая Книжная полка[^].

Удачи вам в вашем программном путешествии - не падайте духом и наслаждайтесь!

Jamim

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

CHill60

Это не вызовет никаких ошибок, но разделение облегчает сужение, когда ошибки действительно происходят - вы всегда будете получать ошибки по пути :-)
Так держать!