2016-06-02 4 views
1

Я пытаюсь манипулировать выпадающим списком, чтобы показывать только определенные значения, которые я желаю, из источника привязки. Вот код, который у меня есть.Выберите только определенные значения из источника привязки, который будет отображаться в combobox

provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" 
    datafile = "C:\Users\Jacob\Desktop\Halton\HaltonProject.accdb" 
    connString = provider & datafile 
    myConnection.ConnectionString = connString 
    myConnection.Open() 

    Dim str As String 
    str = "SELECT * FROM [Employee] WHERE (SP_Level <> 0)" 
    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) 
    Dim dr As OleDbDataReader = cmd.ExecuteReader 


    Dim Full_Name As String 

    While dr.Read 
     Full_Name = dr("Full_Name").ToString 
     SP_Emp1.Items.Add(Full_Name) 
     SP_Emp2.Items.Add(Full_Name) 
     SP_Emp3.Items.Add(Full_Name) 
     SP_Emp4.Items.Add(Full_Name) 
    End while 

Как он стоит этот код выглядит на «SP_Level» и отфильтровывает любые сотрудники, которые имеют «0», перечисленные там. Строка «Full_Name» возвращает всех сотрудников, которые указаны как «0» в столбце «SP_Level».

Я хотел бы оставить привязку данных combobox к EmployeeBindingSource, показывая только новые отфильтрованные строки «Full_Name», созданные вышеприведенным кодом. Я попытался фильтровать связующий источник, но это возвращает только первую алфавитную строку, которая будет соответствовать, а затем останавливается. Я уверен, что есть простое решение, которое я просто не могу найти его

Data bound combobox

Access table used in data-binding

Я совершенно новой для VB программирования, так что я прошу прощения, если это плохо сформулировано. Пожалуйста, дайте мне знать, если я могу лучше объяснить что-нибудь.

+2

ли SP_Level строки? Нет причин конкатенировать это. Это просто 'WHERE (SP_Level <> 0)' Ваша петля имеет мало смысла. userFound и Full_Name будут только последними элементами цикла, если вы не покажете нам все. – LarsTech

+1

Каждая строка представляет новый фильтр 'SP> 0',' PB> 0' и т. Д. Вместо того, чтобы пытаться получить один источник для этого, вы можете создавать разные представления для каждого критерия и связываться с ним. Множество таких навыков должно составлять 1: м таблицу. – Plutonix

+0

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

ответ

1

Вы можете использовать/использовать те же самые DataSource для каждого набора строк/навыков, вам просто нужно их фильтровать соответственно. Это создает DataView для каждого критерия, а не вручную, отфильтровывая некоторые из источника или с использованием нового запроса, чтобы создать только несколько различные источники:

' my fake table 
Dim colors As String() = {"Red", "Green", "Blue", "Orange", "White"} 
Dim dt As New DataTable 
dt.Columns.Add("color", GetType(String)) 

For Each s As String In colors 
    dt.Rows.Add(s) 
Next 

' create a view for each level and bind it 
Dim SPView As New DataView(dt, "Color <> 'Red'", "", DataViewRowState.CurrentRows) 
ComboBox1.DataSource = SPView 
ComboBox1.DisplayMember = "color" 

Dim XPView As New DataView(dt, "Color <> 'Green'", "", DataViewRowState.CurrentRows) 
ComboBox2.DataSource = XPView 
ComboBox2.DisplayMember = "color" 

Dim ZPView As New DataView(dt, "Color <> 'Blue'", "", DataViewRowState.CurrentRows) 
ComboBox3.DataSource = ZPView 
ComboBox3.DisplayMember = "color" 
+0

Благодарим вас, я долгое время задерживался на этом. Я надеялся, что это просто новый синтаксис, о котором я раньше не видел/не слышал! Я очень ценю это, наслаждаюсь остальной частью вашего дня. –